Było wiele pytań dotyczących obsługi typów odniesienia nieululujących w .NET. Wielką nadzieją były umowy kodowe, ale ogranicza się to do sprawdzania czasu pracy dla tych, którzy mają ograniczony budżet.Nielegalne typy odniesienia (jeszcze raz)
Co do podejść innych niż umowy kodowe, Jon Skeet napisał o tym kilka lat temu blog post, a jeden z komentatorów dostarczył przydatnego wyglądu NonNull struct, który zmodyfikował IL, aby wyłączyć domyślny konstruktor. Wydaje się, że jest to doskonałe podejście i mogę sobie wyobrazić rozszerzenie go tak, aby zapewniał wszelkiego rodzaju nie-nullable microtypes. Manipulacja IL może być etapem następującym po uruchomieniu wywołanym przez atrybut na struct, np.
//Microtype representing a non-zero age, so we want to disable the default ctor
[NoDefaultConstructor]
public struct Age
{
public Age(int age)
{
// Implementation (including validation) elided
}
}
Zanim przejdę do dalszych rozważań, chciałbym zapytać, czy ktoś wie o jakichkolwiek problemach z tym związanych? Nie byłem w stanie wymyślić żadnego.
Jaki jest Twój przypadek użycia w przypadku niezerowego typu odniesienia? –
Dla tych, których budżet rozciąga się na ReSharper, jest tam przydatna funkcja sprawdzania nieważności (choć oczywiście nie jest tak kompletna jak rzeczy kontraktów w drogich wersjach VS). – AakashM
@AnthonyPegram Myślę, że większość zastosowań typów referencyjnych niejawnie nie ma wartości NULL , więc egzekwowanie, że za pomocą metody podpisu jest wygraną pod względem dokumentacji i bezpieczeństwa. – Akash