Creé una propiedad automatizada:
public int Foo { get; }
Esto es solo getter. Pero cuando construyo un constructor, puedo cambiar el valor:
public MyClass(string name)
{
Foo = 5;
}
¿Por qué es posible, aunque esto sea solo para obtener?
Respuestas:
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:
También se pueden encontrar más detalles en el repositorio de dotnet Roslyn en GitHub :
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'):
fuente
CS0200 C# Property or indexer cannot be assigned to -- it is read only
cuando se usa una propiedad regular. ¿Las "propiedades automáticas de solo captador" se consideran de solo lectura o no?Esta es una nueva característica en C # 6 que le permite crear propiedades de solo lectura e inicializar sus valores desde el constructor (o en línea cuando los declare).
Si intenta cambiar el valor de esta propiedad fuera del constructor, le dará un error de compilación.
Es de solo lectura en el sentido de que una vez que inicializa su valor (en línea o dentro del constructor), no puede cambiar su valor.
fuente
Si no fuera posible inicializar la propiedad de solo lectura desde el constructor (o un inicializador de propiedad automática), entonces sería inútil, ya que siempre devolvería el valor predeterminado para su tipo (0 para números, nulo para tipos de referencia ). La misma semántica se aplica a los campos de solo lectura en todas las versiones de C #.
Para definir una verdadera propiedad de solo captador (que no se puede inicializar desde el constructor), debe especificar lo que devuelve como parte de la definición:
O, de forma más concisa en C # 6:
fuente
"Propiedades implementadas automáticamente de solo lectura"
Antes que nada quiero aclarar que la propiedad como
Se conoce como "propiedades implementadas automáticamente de solo lectura".
Para verificar esto, puede ejecutar y verificar el código anterior con Visual Studio. Si cambia la versión de idioma de C # 6.0 a C # 5.0, el compilador generará la siguiente excepción. Característica 'Propiedades implementadas automáticamente de solo lectura' no está disponible en C # 5. Utilice la versión de idioma 6 o superior.
para cambiar la versión del idioma C #, visite aquí
Ahora llego a tu segunda pregunta
“Esto es sólo getter. Pero cuando construyo un constructor, puedo cambiar el valor "
Microsoft presenta las "propiedades implementadas automáticamente de solo lectura" en la lógica de solo lectura. Como sabemos, la palabra clave "readonly" está disponible en C # 1.0. utilizamos la palabra clave "readonly" como modificador en un campo y ese campo se puede asignar de 2 formas, ya sea en el momento de la declaración o en un constructor de la misma clase.
De la misma manera, el valor de "propiedades implementadas automáticamente de solo lectura" se puede asignar de 2 maneras
Way1 (en el momento de la declaración):
Way2 (en un constructor de la misma clase)
Propiedad puramente de solo lectura
Si está buscando una propiedad puramente de solo lectura, elija esto
ahora no puede asignar el valor de la propiedad "FullName" del constructor. Si intenta hacerlo, arrojará las siguientes excepciones
"No se puede asignar la propiedad o el indexador 'Person.FullName'; es de solo lectura"
fuente
La característica de propiedad automática se agregó al lenguaje durante el lanzamiento de C # 3.0. Le permite definir una propiedad sin ningún campo de respaldo, sin embargo, aún necesita usar el constructor para inicializar estas propiedades automáticas a un valor no predeterminado. C # 6.0 introduce una nueva característica llamada inicializador automático de propiedades que le permite inicializar estas propiedades sin un constructor como el siguiente:
Puedes encontrar más información sobre esto aquí.
fuente
Una variable declarada
readonly
se puede escribir dentro de un constructor, pero en los lenguajes que respetan el atributo, no se puede modificar después de que el constructor regrese. Ese calificador se proporcionó como una característica del lenguaje porque a menudo es necesario para campos cuyos valores variarán en función de los parámetros del constructor (lo que significa que no se pueden inicializar antes de que comience el constructor) pero no tendrán que cambiar después de que los constructores regresen, pero fue solo utilizable para variables expuestas como campos. La semántica de losreadonly
campos calificados en muchos casos habría sido perfecta para los miembros públicos, excepto que a menudo es mejor para las clases exponer los miembros, incluso los inmutables, como propiedades en lugar de campos.Así como existen propiedades automáticas de lectura-escritura para permitir que las clases expongan propiedades mutables tan fácilmente como los campos ordinarios, existen propiedades automáticas de solo lectura para permitir que las clases expongan propiedades inmutables tan fácilmente como los
readonly
campos calificados. Así como losreadonly
campos calificados se pueden escribir en un constructor, también ocurre con las propiedades de solo obtención.fuente