Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

453
Vistas
Patrón anulable de C # 10: ¿cómo decirle al compilador que configuré la propiedad no anulable en el constructor indirectamente?

Considere un ejemplo:

 class Test { string S { get; set; } public Test() { Init(); } private void Init() { S = "hello"; } }

Al utilizar la función de proyecto de C# anulable, este ejemplo activará una advertencia del compilador:

Advertencia CS8618 La propiedad que no acepta valores NULL 'S' debe contener un valor que no sea NULL al salir del constructor. Considere declarar la propiedad como anulable.

Sin embargo, la propiedad SÍ contiene un valor no nulo al salir del constructor, simplemente no se establece directamente en el constructor, sino indirectamente en un método que se llama incondicionalmente desde el constructor.

Este ejemplo muestra claramente que no hay posibilidad de que la propiedad S sea nula. Cuando se crea una instancia de la clase Test , el método Init() se llama incondicionalmente, por lo que la propiedad S SIEMPRE se establece en "hola".

Por supuesto, esta advertencia se puede suprimir en el código, pero esto se ve feo. ¿Es una mejor manera de decirle al compilador que realmente configuré la propiedad S en un valor no nulo en otro lugar?

Por cierto, si realmente se pregunta POR QUÉ establecer valores en el constructor indirectamente, consideremos que hay otra propiedad derivada D de tipo Derived . Para crear una instancia de Derived , primero se debe analizar la cadena y no queremos analizar la cadena cada vez que leemos la propiedad D

Entonces, el código más realista se vería más así:

 class Test { public string S { get => _S; set => D = new Derived(_S = value); } public Derived D { get; private set; } public Test(string s) => D = new Derived(_S = s); private string _S; }

Como puede ver, tanto S como D se establecen en valores no nulos al salir del constructor. Sin embargo, el código aún activa la advertencia del compilador CS8618.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Use MemberNotNullAttribute para marcar su función:

 using System.Diagnostics.CodeAnalysis; class Test { string S { get; set; } public Test() { Init(); } [MemberNotNull(nameof(S))] private void Init() { S = "hello"; } }

El compilador ahora se quejará si no inicializa S en Init :

ingrese la descripción de la imagen aquí

Vea más escenarios en este artículo: Atributos para el análisis estático de estado nulo

over 4 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 Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda