Parece-me que realmente não há garantia de que uma variável não anulável nunca terá nulo. Imagine que eu tenho uma classe que possui uma propriedade que não é anulável:
public class Foo
{
public Foo(string test)
{
Test = test;
}
public string Test {get;set;}
}
Agora, isso pode parecer que agora não pode ser nulo. Mas se fizermos referência a essa classe com outra biblioteca que não usa contexto nulo, nada impede que ele envie nulo lá.
Isso está correto ou há algumas verificações em tempo de execução, talvez, que garantam isso?
c#
c#-8.0
nullable-reference-types
Ilya Chernomordik
fonte
fonte
public void Foo(string test){...}
oupublic Foo(string test){...}
?Respostas:
É o que a MS diz sobre ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ):
fonte
alguém sempre pode fazer
Pode ser que você possa usar o Domain Driven Design
fonte
Você está correto, outro código que não está usando o novo recurso pode atribuir nulo a essa propriedade; não há verificações em tempo de execução; são apenas dicas completas.
Você sempre pode fazer isso sozinho se quiser uma verificação de tempo de execução:
Observe que você pode garantir que não seja nulo na maioria do seu código, basta adicionar guardas à API pública de nível superior e garantir que as classes sejam adequadamente seladas etc.
Claro que as pessoas ainda podem usar a reflexão para f *** seu código, mas então é sobre eles
fonte
Of course people can still use reflection to f*** your code up
, verdadeiro, verdadeiro mesmo. Você definitivamente pode usar a reflexão para fazer isso, é recomendado , não , as pessoas ainda fazem isso, sim.Mesmo em seu próprio código, se você optar por fazê-lo, poderá passar
null
usando o operador que perdoa nulo.null!
é considerado não nulo no que diz respeito à análise de nulidade do compilador.fonte
Para lidar com verificações nulas e também tornar seu código legível, sugiro o padrão Null Object Design.
Mais leitura aqui:
https://www.c-sharpcorner.com/article/null-object-design-pattern/
Basicamente, envolve a criação de um novo objeto derivado da mesma interface e com instância nula.
Exemplo:
Os nulos não podem ser evitados, mas podem ser verificados de maneira limpa.
fonte