Мне кажется, на самом деле нет никакой гарантии, что ненулевая переменная никогда не будет иметь значение null. Представьте, что у меня есть класс с одним свойством, которое не может быть обнуляемым:
public class Foo
{
public Foo(string test)
{
Test = test;
}
public string Test {get;set;}
}
Теперь может показаться, что теперь оно не может быть нулевым. Но если мы ссылаемся на этот класс с другой библиотекой, которая не использует обнуляемый контекст, ничто не мешает ему отправлять туда ноль.
Это правильно или есть некоторые проверки во время выполнения, а может быть, которые это обеспечивают?
c#
c#-8.0
nullable-reference-types
Илья Черномордик
источник
источник
public void Foo(string test){...}
илиpublic Foo(string test){...}
?Ответы:
Вот что говорит MS ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ):
источник
кто-то всегда может сделать
Может быть, вы можете использовать Domain Driven Design
источник
Вы правы, другой код, который не использует новую функцию, может присвоить этому свойству значение null, нет никаких проверок во время выполнения, это просто подсказки для соответствия.
Вы всегда можете сделать это сами, если хотите проверить время выполнения:
Обратите внимание, что вы можете гарантировать отсутствие значения null в большей части своего кода, вам просто нужно добавить защиту в ваш публичный API верхнего уровня и убедиться, что классы должным образом запечатаны и т. Д.
Конечно, люди все еще могут использовать рефлексию, чтобы прокрутить ваш код, но тогда это на них
источник
Of course people can still use reflection to f*** your code up
правда, правда так и есть. Вы определенно можете использовать рефлексию, чтобы сделать это, рекомендуется , нет , люди все еще делают это, да.Даже в вашем собственном коде, если вы решите сделать это, вы можете передать
null
, используя оператор NULL.null!
считается ненулевым, поскольку анализ компилятора обнуляется.источник
Чтобы справиться с нулевыми проверками, а также сделать ваш код читабельным, я предлагаю шаблон Null Object Design.
Больше читать здесь:
https://www.c-sharpcorner.com/article/null-object-design-pattern/
По сути, это включает в себя создание нового объекта, который получен из того же интерфейса и имеет нулевой экземпляр.
Пример:
Нулей нельзя избежать, однако их можно проверить чисто.
источник