una qué que propiedades property predefinidas polimorfismo polimorfico microsoft llamar interfaces instanciar implemented herencia form example encapsulamiento empleado ejemplo derivada constructores composicion clases clase abstracta c# automatic-properties

qué - set property c# example



¿Por qué una propiedad anulada de obtener solo permanece nula cuando se establece en el constructor de la clase base? (2)

El compilador trata esto como abajo; Básicamente, el código en el constructor escribe en el campo de respaldo original , en TestBase . Parece que el suyo no es un escenario compatible, pero ... Me pregunto si el equipo de idiomas ha considerado este caso.

BTW: si alguna vez quieres ver lo que hace el compilador con el código: sharplab.io

public class TestBase { [CompilerGenerated] private readonly string <ReadOnly>k__BackingField; // note: not legal in "real" C# public virtual string ReadOnly { [CompilerGenerated] get { return <ReadOnly>k__BackingField; // the one in TestBase } } public TestBase() { <ReadOnly>k__BackingField = "from base"; } } internal class Test : TestBase { [CompilerGenerated] private readonly string <ReadOnly>k__BackingField; public override string ReadOnly { [CompilerGenerated] get { return <ReadOnly>k__BackingField; // the one in Test } } }

Probé el siguiente ejemplo:

public class TestBase { public virtual string ReadOnly { get; } public TestBase() { ReadOnly = "from base"; } } class Test : TestBase { public override string ReadOnly { get; } public Test() { // nothing here } }

Cuando creo una instancia de Test, veo que ReadOnly permanece nulo. ¿Pero por qué? Realmente no lo entiendo, ¿podría alguien explicarme por qué sucede esto? Al menos esperaría y error, que una propiedad de solo lectura no se puede establecer fuera de la clase propietaria.


La forma más fácil de explicar esto es considerar qué código está generando el compilador para implementar esto.

La clase base es equivalente a esto:

public class TestBase { public virtual string ReadOnly => _testBaseReadOnly; public TestBase() { _testBaseReadOnly = "from base"; } readonly string _testBaseReadOnly; }

La clase derivada es equivalente a esto:

class Test : TestBase { public override string ReadOnly => _testReadOnly; readonly string _testReadOnly; }

Lo importante a tener en cuenta aquí es que la clase derivada tiene su CAMPO DE RESPALDO PROPIO para ReadOnly - NO reutiliza el de la clase base.

Al darse cuenta de eso, debería ser evidente por qué la propiedad anulada es nula.

Es porque la clase derivada tiene su propio campo de respaldo para ReadOnly , y su constructor no está inicializando ese campo de respaldo.

Por cierto, si está utilizando Resharper , en realidad le advertirá que no está configurando ReadOnly en la clase derivada:

"Get-only auto-property ''ReadOnly'' is never assigned."