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żywać ?:
??
operatorów DOKŁADNIE jako Jeśli / Inaczej?
Moje pytanie:
Jak napisać to za pomocą?: ?? operatorów
[1]
if ( Source == null ){
// Return Nothing
} else {
return Source;
}
[2]
if ( Source == value ){
// Do Nothing
} else {
Source = value;
RaisePropertyChanged ( "Source" );
}
W skrócie : jak nic nie robić, nic nie zwracać i wykonywać wiele instrukcji z ?:
??
operatorem?
c#
ternary-operator
Ahmed Ghoneim
źródło
źródło
Odpowiedzi:
W przypadku [1] nie możesz: te operatory mają zwracać wartość, a nie wykonywać operacji.
Ekspresja
oblicza, że
b
jeślia
jest prawdą i oblicza, żec
jeślia
jest fałszem.Ekspresja
szacuje, że
b
ifb
nie jest null, i oblicza, żec
ifb
jest null.Jeśli piszesz
return a ? b : c;
lub
return b ?? c;
będą zawsze coś zwrócić.
W przypadku [2] możesz napisać funkcję, która zwraca właściwą wartość, która wykonuje Twoje „operacje wielokrotne”, ale jest to prawdopodobnie gorsze niż zwykłe używanie
if/else
.źródło
Operator trójargumentowy (
?:
) nie jest przeznaczony do sterowania przepływem , jest przeznaczony tylko do przypisywania warunkowego . Jeśli chcesz kontrolować przepływ swojego programu, użyj struktury kontrolnej, takiej jakif
/else
.źródło
?:
. Ale mam duży problem z tym, że są używane do sterowania przepływem, a zwłaszcza zagnieżdżonym przepływem sterowania!Odnosząc się do ?: Operator (odwołanie w C #)
Odnosząc się do ?? Operator (odwołanie w C #) Operator (C # Reference)
To znaczy:
[Część 1]
return source ?? String.Empty;
[Część 2] nie ma zastosowania ...
źródło
„Nic nie rób” tak naprawdę nie działa?
if przez // Return Nic, co właściwie masz na myśli, return null to napisz
return Source;
jeśli masz na myśli, zignoruj ścieżkę kodu, a następnie napisz
if ( Source != null ) { return Source; } // source is null so continue on.
I na koniec
if ( Source != value ) { Source = value; RaisePropertyChanged ( "Source" ); } // nothing done.
źródło
Operator trójargumentowy ZWRACA jedną z dwóch wartości. Lub może wykonać jedną z dwóch instrukcji na podstawie swojego stanu, ale generalnie nie jest to dobry pomysł, ponieważ może prowadzić do niezamierzonych skutków ubocznych.
W tym przypadku () nic nie robi, podczas gdy baz coś robi. Ale tylko uczyniłeś kod mniej przejrzystym. Wybrałbym bardziej szczegółowy kod, który jest jaśniejszy i łatwiejszy w utrzymaniu.
Co więcej, nie ma to w ogóle sensu:
var foo = bar ? () : baz();
ponieważ () nie ma typu zwracanego (jest void), a baz ma typ zwracany, który jest nieznany w momencie wywołania w tym przykładzie. Jeśli się nie zgodzą, kompilator będzie głośno narzekał.
źródło
Jeśli martwisz się szczegółowością twojego kodu, napiszę to, zamiast próbować nadużywać wyrażeń.
if (Source == value) return; Source = value; RaisePropertyChanged("Source");
źródło
?: jest operatorem trasy. (uwierz, że poprawnie to przeliterowałem) i jest prosty w użyciu. jak w predykacie boolowskim? iftrue: ifalse; Ale musisz mieć rvalue / lvalue jak w rvalue = predicate? iftrue: iffalse;
dawny
int i = x < 7 ? x : 7;
jeśli x było mniejsze niż 7, zostałbym przypisany x, jeśli nie, byłbym 7.
możesz również użyć go w zamian, 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 osiągnąć.źródło
?:
Operator zwraca jedną z dwóch wartości w zależności od wartości Boolean wypowiedzi.Dowiedz się więcej o
?:
operatorze, znanym również jako operator trójskładnikowy:źródło
Nie sądzę, żebyś mógł to być operatorem i przypuszcza, że zwróci jeden lub drugi. To nie jest zamiana instrukcji if else, chociaż można jej użyć do tego w niektórych przypadkach.
źródło