2012-12-04 11 views
10

Mam następujące dwa podejścia dla tej samej funkcjonalności - jedna z warunkiem "if", a druga z "?? i odlewania”Które podejście jest lepsze DlaczegoCzy stan "Jeśli" jest lepszy niż? i odlewanie

Kod:.?

Int16? reportID2 = null; 
    //Other code 

    //Approach 1 
    if (reportID2 == null) 
    { 
     command.Parameters.AddWithValue("@report_type_code", DBNull.Value); 
    } 
    else 
    { 
    command.Parameters.AddWithValue("@report_type_code", reportID2); 
    } 

    //Approach 2 
    command.Parameters.AddWithValue("@report_type_code", ((object) reportID2) ?? DBNull.Value); 

UPDATE

Na podstawie odpowiedzi, są następujące korzyści ??

  1. Zwiększona czytelność
  2. Zmniejszona ilość rozgałęzień w przepływie programu (zredukowany cykl złożoność omatyczna)

Uwaga: Koszt odlewania jako obiekt jest nieistotny.

mającej

  1. Null-Coallescing Operator - Why Casting?
+0

Zostawiłabym znaczniki 'null-col-op',' performance' oraz 'casting'. – abatishchev

Odpowiedz

4

Zawsze używam null-coalescing operator w takich przypadkach:

command.Parameters.AddWithValue("@name", value ?? DBNull.Value); 

command.ExecuteScalar() as int? ?? -1; 

itp

Zwiększa kodu reada zdolność, zmniejsza głębokość rozgałęzienia. Został również stworzony specjalnie do scenariuszy związanych z bazą danych, takich jak ADO.NET.

+0

Dlaczego uważasz, że jest lepiej? – Lijo

+0

Dlaczego to się kompiluje? Czy nie "narzekał" na niekompatybilne typy po obu stronach? – CodesInChaos

+0

@CodesInChaos: Oczywiście, nie będzie. Właśnie wyszedłem dla lepszej czytelności. – abatishchev

10

Operator koalescencji zerowej (??) jest lepszym rozwiązaniem, ponieważ działa tak samo jak początkowy blok, ale w pojedynczej, łatwej do odczytania linii. Dzięki temu kod jest bardziej czytelny i łatwiejszy w utrzymaniu.

Jest to jeden z wielu przykładów cukru syntaktycznego, czyli instrukcji kodu, które są "skrótami" do reprezentowania powszechnie używanego pomysłu. Innym tego przykładem jest i++, ponieważ zastępuje on i = i + 1. Jest czystszy i prostszy, podobnie jak ??.

+1

Przepraszam, ale jesteś w błędzie, przełącznik to tabela skoków, a nie proste, jeśli! Dlatego dozwolone są tylko proste wartości. –

+5

@FelixK .: W przypadku switcha mniejszego niż 4 - jest to po prostu jeśli-else (nieopakowane przez kompilator) – abatishchev

+3

@FelixK. IMO to tylko szczegół implementacji. Kompilator może zamienić wiele 'if's w ​​tabelę skoku i zamienić na wiele' jeśli's. – CodesInChaos

2

W twoim przykładzie podejście 2 jest lepsze. Ty should not repeat yourself, a apprach 1 ma kod i nazwę parametru dwa razy. Jeśli chcesz zmienić nazwę paramater, powinieneś to zrobić w dwóch miejscach, a to jest kłopot.

Prawdziwy kod porównać to jest to:

object value = DBNull.Value; 
if (reportID2 != null) 
{ 
    value = reportID2; 
} 
command.Parameters.AddWithValue("@report_type_code", value); 

Jeśli używasz tego czy operator ?? to kwestia osobistych preferencji. Myślę, że if jest bardziej przejrzysty, szczególnie dlatego, że w przypadku operatora koalescencji potrzebny jest nawias i rzut.

+0

Wydajność co jest lepsze? Podejście 1 lub Podejście 2? – Lijo

+4

Nie. Nie powinieneś się martwić wydajnością w tym przypadku. Różnica jest znikoma. – Sjoerd

+0

Czy możesz poprawić swoją odpowiedź, podając następujące szczegóły, jeśli się zgadzasz? 1) Podejście 2 jest bardziej czytelne 2) AddWithValue zawsze powoduje boks jako obiekt 3) Rzucanie do obiektu nie jest kosztowne. – Lijo

0

Wolałbym operatora ??. Chociaż zwięzłość nie zawsze prowadzi do lepszej czytelności, w tym przypadku jest tak, ponieważ jako czytelnik nie trzeba porównywać tego, co jest równe, a co różni się między dwoma wierszami if i else. Ponadto wyeliminowałeś duplikowanie kodu (co zawsze jest dobre!). Rozważ przypadek zmiany nazwy pola bazy danych o nazwie @report_type_code.Następnie musisz to zmienić w jednym miejscu.

Powiązane problemy