Wydaje mi się, że tak naprawdę nie ma gwarancji, że zmienna nie dopuszczająca wartości zerowej nigdy nie będzie miała wartości null. Wyobraź sobie, że mam klasę, która ma jedną właściwość, która nie ma wartości zerowej:
public class Foo
{
public Foo(string test)
{
Test = test;
}
public string Test {get;set;}
}
Teraz może się wydawać, że teraz nie może być zerowy. Ale jeśli odniesiemy tę klasę do innej biblioteki, która nie korzysta z kontekstu zerowalnego, nic nie powstrzyma jej przed wysłaniem wartości null.
Czy to jest poprawne, czy są też jakieś kontrole środowiska wykonawczego, które mogą to zapewnić?
c#
c#-8.0
nullable-reference-types
Ilya Chernomordik
źródło
źródło
public void Foo(string test){...}
czypublic Foo(string test){...}
?Odpowiedzi:
O tym mówi MS ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ):
źródło
ktoś zawsze może to zrobić
Możliwe, że możesz użyć Domain Driven Design
źródło
Masz rację, inny kod, który nie korzysta z nowej funkcji, może przypisać null tej właściwości, nie ma żadnych kontroli w czasie wykonywania, to tylko wskazówki dotyczące zgodności.
Zawsze możesz to zrobić samodzielnie, jeśli chcesz sprawdzić środowisko wykonawcze:
Pamiętaj, że możesz zagwarantować, że nie będziesz mieć wartości zerowej w większości swojego kodu, wystarczy dodać zabezpieczenia do publicznego interfejsu API najwyższego poziomu i upewnić się, że klasy są odpowiednio zapieczętowane itp.
Oczywiście ludzie nadal mogą używać refleksji, aby sfałszować twój kod, ale potem jest on na nich
źródło
Of course people can still use reflection to f*** your code up
, prawda, prawda naprawdę. Zdecydowanie możesz użyć do tego refleksji, czy jest to zalecane , nie , czy ludzie nadal to robią, tak.Nawet we własnym kodzie, jeśli zdecydujesz się to zrobić, możesz przekazać
null
, korzystając z operatora zerującego.null!
jest uważany za wartość zerową, jeśli chodzi o analizę podatności kompilatora.źródło
Aby poradzić sobie z zerowymi kontrolami i uczynić kod czytelnym, sugeruję wzorzec Null Object Design.
Więcej informacji tutaj:
https://www.c-sharpcorner.com/article/null-object-design-pattern/
Zasadniczo polega na utworzeniu nowego obiektu, który pochodzi z tego samego interfejsu i ma instancję zerową.
Przykład:
Wartości zerowych nie da się uniknąć, jednak można je dokładnie sprawdzić.
źródło