Esta es una nueva característica de C # 6, "Propiedades automáticas de solo captador", también conocida como "Inicializadores de propiedades automáticas para propiedades de solo lectura" como se describe en este artículo de la revista MSDN 'C #: El nuevo y mejorado C # 6.0' de Mark Michaelis y en el borrador de la Especificación de lenguaje de C # 6.0 .
El establecedor del campo de solo lectura solo es accesible en el constructor, en todos los demás escenarios el campo sigue siendo de solo lectura y se comporta como antes.
Esta es una sintaxis conveniente para reducir la cantidad de código que necesita escribir y eliminar la necesidad de declarar explícitamente una variable de nivel de módulo privado para mantener el valor.
Esta característica se consideró tan importante ya que, desde la introducción de propiedades implementadas automáticamente en C # 3, las propiedades mutables (aquellas con un getter y setter) se habían vuelto más rápidas de escribir que las inmutables (aquellas con solo un getter), lo que significa que las personas eran tener la tentación de usar propiedades mutables para evitar tener que escribir el código para un campo de respaldo que generalmente se requiere para propiedades de solo lectura. Hay más información sobre las propiedades implementadas automáticamente en la sección correspondiente de la Guía de programación de Microsoft C # .
Esta publicación de blog, '# 1.207 - C # 6.0 - Inicializadores de propiedades automáticas para propiedades de solo lectura' de Sean Sexton tiene una buena explicación y un ejemplo de la siguiente manera:
Antes de C # 6.0, si deseaba una propiedad de solo lectura (inmutable), normalmente usaba un campo de respaldo de solo lectura que se inicializa en el constructor, como se muestra a continuación.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
private readonly DateTime creTime;
public DateTime DogCreationTime
{
get { return creTime; }
}
public Dog(string name)
{
Name = name;
creTime = DateTime.Now;
}
}
En C # 6.0, puede usar propiedades implementadas automáticamente para implementar una propiedad de solo lectura. Para ello, utilice un inicializador de propiedades automáticas. El resultado es mucho más limpio que el ejemplo anterior, donde tuvimos que declarar explícitamente un campo de respaldo.
public class Dog
{
public string Name { get; set; }
// DogCreationTime is immutable
public DateTime DogCreationTime { get; } = DateTime.Now;
public Dog(string name)
{
Name = name;
}
}
También se pueden encontrar más detalles en el repositorio de dotnet Roslyn en GitHub :
Las propiedades automáticas ahora se pueden declarar sin un establecedor.
El campo de respaldo de una propiedad automática de solo captador se declara implícitamente como de solo lectura (aunque esto solo importa a efectos de reflexión). Se puede inicializar a través de un inicializador en la propiedad como en el ejemplo anterior. Además, se puede asignar una propiedad de solo captador en el cuerpo del constructor del tipo declarante, lo que hace que el valor se asigne directamente al campo subyacente:
Se trata de expresar los tipos de manera más concisa, pero tenga en cuenta que también elimina una diferencia importante en el lenguaje entre los tipos mutables e inmutables: las propiedades automáticas eran una forma abreviada disponible solo si estaba dispuesto a hacer que su clase fuera mutable, y por lo tanto, la tentación de predeterminar a eso fue genial. Ahora, con propiedades automáticas exclusivas para captadores, el campo de juego se ha nivelado entre mutable e inmutable.
y en el borrador de la Especificación del lenguaje de C # 6.0 (NB: la especificación del lenguaje es definitiva en lo que respecta a Microsoft, pero aún no ha sido aprobada como estándar EMCA / ISO , de ahí el 'borrador'):
Propiedades implementadas automáticamente
Una propiedad implementada automáticamente (o autopropiedad para abreviar), es una propiedad no abstracta no externa con cuerpos de descriptores de acceso solo con punto y coma. Las propiedades automáticas deben tener un descriptor de acceso get y, opcionalmente, pueden tener un descriptor de acceso establecido.
Cuando una propiedad se especifica como una propiedad implementada automáticamente, un campo de respaldo oculto está disponible automáticamente para la propiedad y los descriptores de acceso se implementan para leer y escribir en ese campo de respaldo. Si la propiedad automática no tiene un descriptor de acceso establecido, el campo de respaldo se considera de solo lectura (campos de solo lectura). Al igual que un campo de solo lectura, también se puede asignar una propiedad automática de solo captador en el cuerpo de un constructor de la clase adjunta. Esta asignación se asigna directamente al campo de respaldo de solo lectura de la propiedad.
Una propiedad automática puede tener opcionalmente un property_initializer, que se aplica directamente al campo de respaldo como variable_initializer (inicializadores de variable).