Me parece que realmente no hay garantía de que una variable no anulable nunca tenga nulo. Imagine que tengo una clase que tiene una propiedad que no es anulable:
public class Foo
{
public Foo(string test)
{
Test = test;
}
public string Test {get;set;}
}
Ahora eso puede parecer que ahora no puede ser nulo. Pero si hacemos referencia a esta clase con otra biblioteca que no utiliza contexto anulable, nada impide que envíe nulo allí.
¿Es correcto o hay algunas comprobaciones de tiempo de ejecución que quizás lo aseguren?
c#
c#-8.0
nullable-reference-types
Ilya Chernomordik
fuente
fuente
public void Foo(string test){...}
opublic Foo(string test){...}
?Respuestas:
Esto es lo que dice MS sobre ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ):
fuente
alguien siempre puede hacer
Puede ser que pueda usar el diseño impulsado por dominio
fuente
Estás en lo correcto, otro código que no está usando la nueva característica podría asignar nulo a esta propiedad, no hay verificaciones en tiempo de ejecución, solo son sugerencias de cumplimiento.
Siempre puede hacerlo usted mismo si desea una verificación de tiempo de ejecución:
Tenga en cuenta que puede garantizar que no sea nulo en la mayoría de su código, solo necesita agregar guardias a su API pública de nivel superior y asegurarse de que las clases estén debidamente selladas, etc.
Por supuesto, la gente todavía puede usar la reflexión para joder su código, pero luego depende de ellos
fuente
Of course people can still use reflection to f*** your code up
, cierto, cierto de hecho. Definitivamente puedes usar la reflexión para hacer esto, se recomienda , no , la gente todavía lo hace, sí.Incluso en su propio código, si elige hacerlo, puede pasar
null
, utilizando el operador que perdona los valores nulos.null!
se considera no nulo en lo que respecta al análisis de nulabilidad del compilador.fuente
Para tratar con verificaciones nulas y también hacer que su código sea legible, sugiero el patrón de diseño de objetos nulos.
Más lectura aquí:
https://www.c-sharpcorner.com/article/null-object-design-pattern/
Básicamente, implica crear un nuevo objeto que se deriva de la misma interfaz y tiene una instancia nula.
Ejemplo:
No se pueden evitar los valores nulos, sin embargo, se pueden verificar limpiamente.
fuente