Wiem, że jestem niesamowicie spóźniony z tym pytaniem, ale czuję, że odpowiedź nabierze znaczenia, gdy ostatnia główna iteracja języka C # będzie bliżej wydania, a następnie wydania. W C # 8.0 nastąpi poważna zmiana, C # założy, że wszystkie typy nie są null.
Według Madsa Torgersena:
Problem polega na tym, że zerowe odwołania są tak przydatne. W C # są one wartością domyślną każdego typu referencyjnego. Jaka byłaby inna wartość domyślna? Jaką inną wartość miałaby zmienna, dopóki nie zdecydujesz, co jeszcze jej przypisać? Jaką inną wartością moglibyśmy utorować świeżo przydzieloną tablicę odniesień, dopóki nie zajmiesz się jej wypełnieniem?
Czasami wartość zerowa jest sensowną wartością samą w sobie. Czasami chcesz przedstawić fakt, że, powiedzmy, pole nie ma wartości. Że można przekazać „nic” dla parametru. Czasami jednak nacisk kładzie się na. I tu pojawia się kolejna część problemu: języki takie jak C # nie pozwalają na wyrażenie, czy null tutaj jest dobrym pomysłem, czy nie.
Tak więc rezolucja nakreślona przez Madsa to:
Uważamy, że częściej chce się, aby odniesienie nie było zerowe. Typy odwołań dopuszczające wartość zerową byłyby rzadszym rodzajem (chociaż nie mamy dobrych danych, aby powiedzieć nam, o ile), więc to one powinny wymagać nowej adnotacji.
Język ma już pojęcie - i składnię - typów wartości dopuszczających wartość null. Analogia między nimi sprawiłaby, że dodawanie języka byłoby koncepcyjnie łatwiejsze i językowo prostsze.
Wydaje się słuszne, że nie powinieneś obciążać siebie ani swojego konsumenta uciążliwymi wartościami zerowymi, chyba że aktywnie zdecydujesz, że ich chcesz. Null, a nie ich brak, powinny być tym, na co musisz wyraźnie wyrazić zgodę.
Przykład pożądanej funkcji:
public class Person
{
public string Name { get; set; } // Not Null
public string? Address { get; set; } // May be Null
}
Wersja zapoznawcza jest dostępna dla programu Visual Studio 2017, 15.5.4+ w wersji zapoznawczej.