2012-01-29 19 views
8

Czy konserwacja staje się koszmarem na kod, który dopuszcza typu wartości zerowej typu zerowego? Zdaję sobie sprawę, że int? jest odpowiednikiem Nullable<int>, ale moje pytanie jest bardziej ukierunkowane na użyteczność tego. Widzimy typy wartości i oczywiście pomijamy je jako nie pozwalające na null. Ale wprowadzenie Nullable<T> ze skrótem znaku zapytania, jest oczywiste, co robi, ale nie zawsze jest zauważalne.Zła praktyka używania Nullable <T> z typami wartości?

Jest to jedna z tych cech, które tylko dlatego, że może zrób to, nie oznacza, że ​​powinny?

Jakie powinny być preferencje? Domyślna wartość typu wartości (tj. int SomeConfigOption = -1;) lub wykorzystująca Nullable<T> (tj. int? SomeConfigOption;)?

+0

'Nullable ' jest * tylko * przeznaczone do stosowania z typami wartości. Wydaje się, że pytasz, czy 'Nullable ' powinno być generalnie uważane za szkodliwe. – Cameron

+0

@Cameron Myślę, że moje brzmienie było trochę niewyraźne. I niekoniecznie bezpośrednio szkodliwe, po prostu dodając złożoności. –

+1

Cokolwiek robisz, nie pisz struktury, a następnie użyj 'Nullable ' z nią. Wczoraj natknąłem się na to w kodzie produkcyjnym, uzupełniając go przez odniesienie (ponieważ było to zmienne). Po prostu zrób z tego klasę! – TrueWill

Odpowiedz

11

Jakie powinny być preferencje? Domyślna wartość typu wartości (tj. int SomeConfigOption = -1;) lub wykorzystująca wartość Nullable (tj. Int? SomeConfigOption;)?

W tym przypadku wyraźnie chcesz Nullable<T> gdy masz sprawę, że trzeba uwzględnić nieobecności o wartości. Liczby magiczne, takie jak -1, są znacznie gorszym koszmarem w utrzymaniu.

Jest to podstawowa funkcja języka C#, podobnie jak w przypadku innych funkcji, które mogą być nadużywane, ale zapewnia również wyraźne korzyści - korzyści te znacznie przewyższają wszelkie problemy, które ktoś nie władający językiem może czytać kod źródłowy - czas aby przyspieszyć.

+2

OK, lubię tę odpowiedź. Ale dlaczego to samo ramy nie wykorzystuje tego?Na przykład 'SelectedIndex' na kontrolce często ma wartość' -1', gdy nie ma wybranego elementu. Dlaczego MSFT nie chciałby użyć 'Nullable ' do tego? To rzuca kluczem w mój silnik. –

+2

Ponieważ funkcja Nullable była niedostępna do .NET 2.0 –

+0

@HansPassant Więc konserwacja na rzecz tradycji? –

0

Wolę typ zerowy od typu wartości z wartością domyślną (co programista oznacza wtedy wartość null). Znalazłem więcej problemów w kodzie, w których wartości domyślne są używane jako nic nie znaczące.

2

Myślę, że Nullable wygląda ładnie: kod z typami zerowymi jest dość samodokumentowany.

Przykłady:

int? someConfigOption; 
if (someConfigOption.HasValue) 
{ 
    // Use someConfigOption.Value property. 
} 
else 
{ 
    // Value is absent. 
} 

Inny przydatny podejście:

int value = someConfigOption.GetValueOrDefault(); 

Oczywiście, te metody, które przyjmują wartości pustych ponieważ ich parametry powinny być dobrze udokumentowane.

Powiązane problemy