2010-10-11 10 views

Odpowiedz

32

Załóżmy, że chciał przekazać zero lub txtNumerator.Text sposobu M. Jak to zrobić?

można powiedzieć:

string argument; 
if (txtNumerator.Text == "") 
{ 
    argument = "0"; 
} 
else 
{ 
    argument = txtNumerator.Text; 
} 
M(argument); 

Albo można powiedzieć

M(txtNumerator.Text == "" ? "0" : txtNumerator.Text); 

Ten ostatni jest krótsze i łatwiejsze do odczytania.

Im większa Chodzi o to, że oświadczenia są użyteczne dla ich skutków ubocznych i wyrażeń są użyteczne dla ich wartości. Jeśli chcesz kontrolować, który z dwóch efektów ubocznych ma miejsce, użyj instrukcji "jeśli". Jeśli chcesz kontrolować, która wartość zostanie wybrana z dwóch możliwości, rozważ użycie wyrażenia warunkowego.

UPDATE:

Jenny pyta, dlaczego nie po prostu to zrobić?

if (txtNumerator.Text == "") 
{ 
    M("0"); 
} 
else 
{ 
    M(txtNumerator.Text); 
} 

To dobrze, jeśli jest tylko jeden warunek do sprawdzenia. Ale co jeśli, powiedzmy, cztery? Obecnie istnieje szesnaście możliwości i pisanie „if” za to dostaje niechlujny co najmniej:

if (text1.Text == "") 
{ 
    if (text2.Text == "") 
    { 
     if (text3.Text == "") 
     { 
      if (text4.Text == "") 
      { 
       M("1", "2", "3", "4"); 
      } 
      else 
      { 
       M("1", "2", "3", text4.Text); 
      } 
     } 
     else 
     { 
      if (text4.Text == "") 
      { 
       M("1", "2", text3.Text, "4"); 
      } 
      else 
      { 
       M("1", "2", text3.Text, text4.Text); 
      } 
     } 
     ... about fifty more lines of this. 

Zamiast tego można po prostu powiedzieć:

M(Text1.Text == "" ? "1" : Text1.Text, 
    Text2.Text == "" ? "2" : Text2.Text, 
    Text3.Text == "" ? "3" : Text3.Text, 
    Text4.Text == "" ? "4" : Text4.Text); 
+0

jeśli pole tekstowe = „”, a następnie zdać jeden, jeszcze zdać dwa –

+0

@eric u da człowiek dziękuję ui zrozumieć teraz –

+1

@jenny: OK, teraz załóżmy, były trzy kolejne argumenty do M, z których każda * również * miała wartość warunkową. To szesnaście możliwości. Czy masz szesnaście różnych połączeń z M? –

8

To jeden wyraz, dzięki czemu można używać wynik bezpośrednio w zadaniu lub wywołaniu funkcji bez konieczności duplikowania kontekstu, w którym go używasz. Dzięki temu wiele scenariuszy użycia jest znacznie czystszych w pisaniu i czytaniu. Na przykład:

int abs = (x >= 0) ? x : -x; 

kontra

int abs; 
if (x >= 0) 
    abs = x; 
else 
    abs = -x; 
+3

To dla mnie jest kluczową kwestią. Możesz subiektywnie argumentować, które podejście jest bardziej estetyczne i wiele zależy od sytuacji, ale posiadanie zdolności do zwarcia osobnego oświadczenia deklaracji i deklaracji przypisania jest znaczące. Ostatecznie operacja trójskładnikowa odgrywa inną rolę niż operacja "jeśli", ponieważ "jeśli" jest przydatne do tworzenia oddzielnych gałęzi kodu, podczas gdy "?" jest przydatny do uzyskania określonej wartości. – Steven

2

Istnieje wiele standardów prowadnice, które mówią, by nie użyć operatora potrójny. Można jednak twierdzić, że wszystkie funkcje językowe są niepotrzebne, z wyjątkiem goto i if. Używam go, kiedy mam mnóstwo, jeśli nie, elses.

+0

Podoba mi się ta odpowiedź –

2

To sprawia, że ​​kod jest bardziej czytelny w opinii niektórych ludzi, wiele konstruktów w języku to cukier syntaktyczny (pomyśl o zrobieniu, podczas ..... i dla (..)) i na końcu w dniu, w którym wybierzesz to, co działa dla ciebie (i twojego zespołu).

ja na przykład uważam, że powyższy kod powinien być realizowany za pomocą metody rozszerzenie:

txtNumerator.SetDefault("0"); 
1

Jeśli pójdziesz z if-then konstruować, możesz skończyć z dwoma zadaniami do tej samej zmiennej, w dwóch oddzielne bloki. Formularz trójskładnikowy ma tylko jedno zadanie. Nie ma więc potrzeby sprawdzania drugiego bloku, aby zweryfikować, co oba bloki wykonują przypisanie do tej samej zmiennej. Pod tym względem myślę, że forma trójskładnikowa brzmi lepiej.

Z drugiej strony, jeśli C# pracował jak Ruby i jeśli była wyrazem, to można zrobić bez operatora potrójnego i używać if-else w tym przypadku:

txtNumerator.Text = if (txtNumerator.Text == "") "0"; else (txtNumerator.Text); 

których wolałbym bo wtedy inna składnia?: może zostać usunięta.

Powiązane problemy