• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

315
Vistas
¿Por qué C # no advierte sobre el campo largo no anulable?

¿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!? } }
over 3 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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? .

over 3 years ago · Santiago Trujillo Denunciar

0

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.

over 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda