¿Por qué no recibo una advertencia no anulable (o alguna otra advertencia) para que FieldTwo no esté configurado en el constructor? Estoy usando .Net 5.0 y la opción Nullable
está configurada como verdadera en el archivo del proyecto.
public class MyClass { public string FieldOne; public long FieldTwo; public MyClass (string p1, long p2) { FieldOne = p1; // FieldTwo is not set. Where is the non-nullable warning!? } }
long
es un tipo de valor y no puede ser nulo. Entonces no hay razón para advertir sobre nulo. Lo que sospecho que desea es una advertencia de campo no inicializado.
Si nunca se asigna un campo privado, genera una advertencia CS0649. Sin embargo, si el campo es público o se modifica en cualquier parte de la clase, esta advertencia no se genera. Por ejemplo, el siguiente sería un código perfectamente aceptable y no debería dar una advertencia:
public class MyClass{ private long myLong; public void Increment() => myLong++; }
Si el campo solo debe establecerse desde el constructor, debe declararlo como de solo lectura. Sin embargo, los campos públicos de solo lectura no activan una advertencia, incluso si probablemente deberían hacerlo. Consulte ¿Por qué NO recibo advertencias sobre campos de solo lectura no inicializados? .
long
es un tipo de valor y no puede ser nulo. Los tipos de valor siempre se inicializan cuando se declaran con un valor predeterminado, en este caso 0
. ¿Tendrías que cambiar el tipo de campo a long?
si quisieras almacenar un null
Esos campos no son propiedades de todos modos. Esto no es solo semántica. Los campos son detalles de implementación, incluso campos públicos. No se consideran parte de la superficie API de una clase. Las propiedades son parte de la API, todos los serializadores las serializan de forma predeterminada (los campos no) y garantizan que, de hecho, tener campos públicos es un olor a código.
Para asegurarse de que todas las propiedades se inicialicen, puede usar un tipo de record
en lugar de una class
:
public record(string PropertyOne, long PropertyTwo);
Esto genera una clase con propiedades de solo inicio para PropertyOne
y PropertyTwo
y un constructor que requiere valores para todas las propiedades. Junto con operadores de igualdad, deconstructores y una implementación de ToString()
que devuelve todas las propiedades en forma de cadena JSON.