:? Operatory zamiast IF / ELSE
public string Source
{
get
{
/*
if ( Source == null ){
return string . Empty;
} else {
return Source;
}
*/
return Source ?? string.Empty;
}
set
{
/*
if ( Source == null ) {
Source = string . Empty;
} else {
if ( Source == value ) {
Source = Source;
} else {
Source = value;
}
}
*/
Source == value ? Source : value ?? string.Empty;
RaisePropertyChanged ( "Source" );
}
}
Czy mogę użyć ?:
??
operatory dokładnie jak gdyby / Else?
Moje Pytanie:
Jak napisać poniższy tekst ?: ?? operatory
[ 1 ]
if ( Source == null ){
// Return Nothing
} else {
return Source;
}
[ 2 ]
if ( Source == value ){
// Do Nothing
} else {
Source = value;
RaisePropertyChanged ( "Source" );
}
Krótko: jak nic nie robić, nic nie zwracać i robić wiele instrukcji z ?:
??
centrala?
9 answers
Dla [1], nie można: operatory te mają zwracać wartość, a nie wykonywać operacje.
Wyrażenie
a ? b : c
Ocenia na b
, Jeśli a
jest prawdziwe, a ocenia na c
, Jeśli a
jest fałszywe.
Wyrażenie
b ?? c
Ocenia na b
Jeśli b
nie jest null i ocenia na c
Jeśli b
jest null.
Jeśli napiszesz
return a ? b : c;
Lub
return b ?? c;
Oni zawsze coś zwrócą.
Dla [2], można napisz funkcję, która zwraca odpowiednią wartość, która wykonuje twoje "wiele operacji" , ale to prawdopodobnie gorsze niż użycie if/else
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:53:34
Operator trójkowy (?:
) nie jest przeznaczony do przepływu sterowania, jest przeznaczony tylko do przypisania warunkowego. Jeśli chcesz kontrolować przepływ swojego programu, użyj struktury sterowania, takiej jak if
/else
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:45:05
Odnosi się do ?: Operator (C # Reference)
Operator warunkowy (?:) powroty jedną z dwóch wartości w zależności od wartość wyrażenia logicznego. Poniżej znajduje się składnia operator warunkowy.
Odnosi się do ?? Operator (C # Reference)
The ?? operatorem nazywa się null-operator koalescencyjny i jest używany aby zdefiniować wartość domyślną dla typy wartości nullable, jak również typy referencyjne. Zwraca operand po lewej stronie, jeśli nie jest null; w przeciwnym razie zwraca prawo operand.
To znaczy:
[Część 1]
return source ?? String.Empty;
[część 2] Nie dotyczy ...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:55:13
"nic nie robić" tak naprawdę nie działa ?
If by / / Return Nothing you actually mean return null then write
return Source;
Jeśli masz na myśli ignorowanie ścieżki kodowej to napisz
if ( Source != null )
{
return Source;
}
// source is null so continue on.
I do ostatniego
if ( Source != value )
{ Source = value;
RaisePropertyChanged ( "Source" );
}
// nothing done.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:45:39
Operator trójdzielny zwraca jedną z dwóch wartości. Albo może wykonać jedno z dwóch poleceń w oparciu o swój stan, ale generalnie nie jest to dobry pomysł, ponieważ może to prowadzić do niezamierzonych skutków ubocznych.
bar ? () : baz();
W tym przypadku () nic nie robi, podczas gdy baz coś robi. Ale tylko uczyniłeś kod mniej jasnym. Wybrałbym bardziej szczegółowy kod, który jest jaśniejszy i łatwiejszy w utrzymaniu.
Co więcej, nie ma to żadnego sensu:var foo = bar ? () : baz();
Ponieważ () nie ma typu return (jest void) i baz ma typ powrotu, który jest nieznany w momencie wywołania w tej próbce. Jeśli się nie zgodzą, kompilator będzie narzekał i głośno.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:47:42
Jeśli interesuje Cię słowność Twojego kodu, napiszę to, zamiast próbować nadużywać wyrażeń.
if (Source == value) return;
Source = value;
RaisePropertyChanged("Source");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:46:31
The ?: jest operatorem trasy. (wierzę, że pisałem to poprawnie) i jest prosty w użyciu. Boolean predykat ? iftrue: ifalse; ale musisz mieć rvalue / lvalue jak w rvalue = predykat ? iftrue: iffalse;
Ex int i = x < 7 ? x : 7;
Gdyby x było mniejsze niż 7, dostałbym przypisane x, jeśli nie byłbym 7.
Możesz również użyć go w zwrocie, jak w return x < 7 ? x : 7;
Ponownie, jak powyżej, miałoby to taki sam wpływ.
Więc, Source = Source == value ? Source : string.Empty;
wierzę, że to jest to, co próbujesz / align = "left" /
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:44:45
Operator ?:
zwraca jedną z dwóch wartości w zależności od wartości wyrażenia logicznego.
Condition-Expression ? Expression1 : Expression2
Znajdziesz tutaj więcej o operatorze ?:
, znanym również jako Operator trójdzielny:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-17 06:38:37
Nie sądzę, że można to operator i jego przypuszczać, aby zwrócić jeden lub drugi. Nie jest to zamiennik instrukcji if else, chociaż może być używany do tego w określonym przypadku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 21:44:29