Rozważ następujący typowy scenariusz:
if(myObject == null) {
myObject = new myClass();
}
Zastanawiam się, co myśli się o następującym zastąpieniu za pomocą operatora zerowania:
myObject = myObject ?? new myClass();
Nie jestem pewien, czy powinienem używać drugiego formularza. Wygląda na to, że jest to ładny skrót, ale myObject = myObject
konstrukcja na początku wydaje się być trochę zapachem kodu.
Czy jest to rozsądne, czy może istnieje lepszy skrót, którego mi brakuje? A może: „To trzy linie, przejedź to!”?
Edycja: Jak już wspomniano, być może nazwanie tego typowym scenariuszem jest przesadą. Zwykle spotykam się z tą sytuacją, gdy pobieram encję z bazy danych, która ma właściwość typu odwołania potomnego, która może być jeszcze zapełniona:
myClass myObject = myClassService.getById(id);
myObject.myChildObject = myObject.myChildObject ?? new myChildClass();
MyClass
powinien podać elementpublic static readonly
członkowskiEmpty
wartości tego typu. ZobaczString.Empty
w MSDN .??=
operatora?Odpowiedzi:
Cały czas używam zerowego operatora koalescencyjnego. Podoba mi się zwięzłość tego.
Uważam, że ten operator ma charakter podobny do operatora trójskładnikowego (A? B: C). Zajmuje trochę praktyki, zanim czytanie tego jest drugą naturą, ale kiedy już się do tego przyzwyczaisz, czuję, że czytelność poprawia się w porównaniu z wersjami długimi.
Opisana sytuacja to tylko jeden scenariusz, w którym operator jest przydatny. Przydatne jest również zastępowanie takich konstrukcji:
lub
z
źródło
myObject = myObject2 ?? myObject3
. Zastanawiam się konkretnie nad użyciem operatora do ustawienia sobie obiektu, chyba że ma on wartość null.null
za porównanie.?? operator
Nazywa operator null koalescencji i służy do określenia wartości domyślnej wartości dla różnych rodzajów i typów pustych odniesienia. Zwraca operand po lewej stronie, jeśli operand nie jest pusty; w przeciwnym razie zwraca odpowiedni operand.myObject = myObject ?? new myObject();
-instantiate default value of object
Więcej szczegółów i przykładowy kod na temat operatora zerowego koalescencji - artykuł MSDN .
Jeśli sprawdzisz
more than nullable
warunek, alternatywnie możesz użyć operatora trójskładnikowego.Operator trójskładnikowy
Możesz także spojrzeć na : Operator . Nosi nazwę operatora trójskładnikowego lub warunkowego . Operator warunkowy (? :) zwraca jedną z dwóch wartości w zależności od wartości wyrażenia logicznego.
Przykład kodu z MSDN -?: Operator (odwołanie do C #) :
źródło
myObject = (myObject == null) ? new myClass() : myObject
. Tak więc, chyba że brakuje mi lepszego użycia operatora warunkowego, wydaje się, że ma ten sam „problem” z ustawieniem dla siebie obiektu (jeśli nie jest on zerowy) jak operator koalescencyjny zerowy - i jest mniej zwięzły.Nie sądzę, że ten scenariusz jest (a przynajmniej powinien być) typowy.
Jeśli nie chcesz, aby domyślna wartość niektórych pól była inna
null
, ustaw ją w inicjalizatorze pola:Lub, jeśli inicjalizacja jest bardziej skomplikowana, ustaw ją w konstruktorze.
Jeśli chcesz tworzyć
myClass
tylko wtedy, gdy jest to potrzebne (np. Ponieważ tworzenie go zajmuje dużo czasu), możesz użyćLazy<T>
:(To wywołuje domyślny konstruktor. Jeśli inicjalizacja jest bardziej skomplikowana, przekaż lambda, która tworzy
myClass
doLazy<T>
konstruktora).Aby uzyskać dostęp do wartości, użyj
myObject.Value
, który wywoła inicjalizację, jeśli jest to pierwszy dostępmyObject.Value
.źródło
Szczególnie podoba mi się używanie
??
w połączeniu z opcjonalnymi parametrami metody. Ograniczam potrzebę przeciążeń i upewniam się, że rzecz ma wartość.źródło