Wszędzie widzę konstrukcje takie jak:
int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;
Dlaczego nie użyć po prostu:
string test = myVar.ToString();
Czy to nie jest dokładnie to samo? Przynajmniej Reflector mówi, że:
public override string ToString()
{
if (!this.HasValue)
{
return "";
}
return this.value.ToString();
}
Czy to prawda (krótsza wersja), czy czegoś mi brakuje?
Odpowiedzi:
Masz całkowitą rację. Również w tym pytaniu sugerowane jest poprzednie rozwiązanie, podczas gdy w rzeczywistości nikt nie zauważa, że
ToString()
już daje prawidłową odpowiedź.Może argument za bardziej opisowym rozwiązania jest czytelność: Podczas rozmowy telefonicznej
ToString()
na coś, co jest rzekomo byćnull
, zwykle oczekująNullReferenceException
, chociaż tutaj nie jest wyrzucane.źródło
ToString()
działa bezNullReferenceException
rzucania się..HasValue
nadal rzucisz ten wyjątek.myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null
sytuacja, w której rozpakowany obiekt jest potrzebny, aby uzyskać dostęp do żądanejToString
metody. Oczywiście jest na to również bardziej zwięzłe rozwiązanie:$"{myNullableDateTime:d}"
Myślę, że wiele osób ma takie kontrole, ponieważ nie jest to naturalne zachowanie obiektu, który może mieć wartość zerową.
źródło
Nie, masz rację, krótsza wersja jest taka sama, jak to, co inni zrobili w tym względzie. Inną konstrukcją, której często używam zamiast trójskładnika z wartościami null, jest operator koalescencji zerowej. który również chroni Cię przed zerami. W przypadku ToString () nie jest to konieczne (jak zauważyłeś), ale dla domyślnych wartości int (na przykład) działa ładnie, np:
która pozwala wykonać wszystkie operacje na liczbach całkowitych na stronie bez uprzedniego jawnego sprawdzenia wartości null i wywołania wartości w currentPage (gdzie currentPage jest int? być może przekazanym jako parametr)
źródło
Wiem, długo po tym, jak było to istotne, ale ... Podejrzewam, że to dlatego, że w przypadku typów dopuszczających wartość null, takich jak int? metoda .ToString () nie pozwala na używanie ciągów formatujących. Zobacz, jak sformatować DateTime dopuszczającą wartość null za pomocą ToString ()? . Być może w oryginalnym kodzie znajdował się ciąg formatu w .ToString () lub być może koder zapomniał, że .ToString () bez łańcucha formatującego jest nadal dostępny dla typów dopuszczających wartość null.
źródło
może jest to po prostu podążanie za wzorem? lub nie znają zaplecza. masz rację kod jest dokładnie taki sam. możesz nawet zrobić:
źródło
int?
jest lukrem składni, który upraszcza deklarację zmiennej dopuszczającej wartość null. To jest to samo coNullable<int>
.Jeśli więc przyjrzysz się implementacji
ToString()
metody forNullable<T>
(patrz poniżej) , możesz zauważyć, że zwraca ona pusty łańcuch w przypadku, gdy nie ma wartości.Co mówi MSDN:
Zatem poniższy kod wypisze pusty ciąg do konsoli zamiast rzucać
ArgumentNullException
wyjątek.źródło