Propiedad automatizada con getter solamente, se puede establecer, ¿por qué?


He creado 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, a pesar de que esto es get-only?

 72
Author: Marv, 2016-01-12

6 answers

Esta es una nueva característica de C# 6, "Propiedades automáticas de solo Getter", también conocida como "Inicializadores de Propiedades automáticas para Propiedades de solo lectura" como se discute en este artículo de la revista MSDN 'C# : La Nueva y Mejorada C# 6.0' de Mark Michaelis y en la Especificación del lenguaje borrador de C# 6.0.

El setter 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 de conveniencia para reduzca la cantidad de código que necesita escribir y elimine la necesidad de declarar explícitamente una variable de nivel de módulo privado para mantener el valor.

Esta característica fue vista tan importante como, desde la introducción de las Propiedades Auto-Implementadas 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 estaban tentadas a usar propiedades mutables para evitar tener que escribir el código normalmente se requiere para propiedades de solo lectura. Hay más discusión sobre las propiedades Auto-Implementadas en la sección relevante de la Guía de Programación en C# de Microsoft.

Esta entrada 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 quería una propiedad de solo lectura (inmutable), por lo general, utilice un campo de respaldo de solo lectura que sea inicializado 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 auto-implementadas para implementar un propiedad de solo lectura. Esto se hace mediante el uso de una propiedad automática inicializador. 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 setter.

El campo de respaldo de una propiedad automática de solo getter es implícitamente declarado como readonly (aunque esto importa solo para la reflexión propósito). Se puede inicializar a través de un inicializador en el propiedad como en el ejemplo anterior. Además, una propiedad getter-only puede ser asignado en el cuerpo constructor del tipo declarante, lo que causa la valor que debe asignarse directamente al campo subyacente:

Se trata de expresar los tipos de forma más concisa, pero tenga en cuenta que también elimina una diferencia importante en el lenguaje entre mutable y tipos inmutables: las propiedades automáticas eran una abreviatura disponible solo si usted estaba dispuesto a hacer que su clase mutable, y por lo que la tentación de por defecto fue genial. Ahora, con las propiedades automáticas de solo getter, el el campo de juego se ha nivelado entre mutable e inmutable.

Y en el C# 6.0 especificación de lenguaje borrador :

Implementado automáticamente propiedades

Una propiedad implementada automáticamente (o auto-propiedad para abreviar), es una propiedad no abstracta no externa con accessor solo de punto y coma cuerpo. Las propiedades automáticas deben tener un accessor get y pueden opcionalmente tener un conjunto de accesorios.

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 accesores están implementados para leer y escribir en eso respaldo campo. Si la propiedad auto no tiene un accessor establecido, el respaldo el campo se considera readonly (campos Readonly). Al igual que un readonly campo, también se puede asignar una propiedad automática de solo getter en el cuerpo de un constructor de la clase que encierra. Tal cesión cede directamente al campo de respaldo de solo lectura de la propiedad.

Una auto-propiedad puede tener opcionalmente un property_initializer, que es aplicado directamente al campo de respaldo como variable_initializer (Variable inicializadores).

 98
Author: tomRedox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-18 10:25:22

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 las declara).

Si intenta cambiar el valor de esta propiedad fuera del constructor, le daría 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.

 23
Author: Yacoub Massad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 17:01:12

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 numéricos, null para tipos de referencia). La misma semántica se aplica a los campos readonly en todas las versiones de C#.

Para definir una propiedad true getter-only (que no se puede inicializar desde el constructor), debe especificar lo que devuelve como parte de la definición:

public int Foo { get { return 5; } }

O, más concisamente en C # 6:

public int Foo => 5;
 12
Author: Douglas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 12:35:03

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 constructor para inicializar estas propiedades automáticas a un valor no predeterminado. C # 6.0 introduce una nueva característica llamada auto property initializer que le permite inicializar estas propiedades sin un constructor como el siguiente:

Anteriormente, se requiere un constructor si desea crear objetos uso de una propiedad automática e inicializar una propiedad automática a un valor no predeterminado como a continuación:

public class MyClass
{
    public int Foo { get; }

    public Foo(int foo)
    {
        Foo = foo;
    }
}

Ahora en C # 6.0, la capacidad de usar un inicializador con la propiedad auto significa que no se requiere ningún código de constructor explícito.

public string Foo { get; } = "SomeString";

public List<string> Genres { get; } = new List<string> { "Comedy", "Drama" };

Puede encontrar más información sobre esto aquí

 4
Author: Rahul Nikate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-13 04:52:57

"readonly automatically implemented properties"

En primer lugar quiero aclarar que la propiedad como

public string FirstName { get; }

Se conoce como "readonly automatically implemented properties"

Para verificar esto puede ejecutar y verificar el código anterior con Visual Studio. Si cambia la versión del idioma de C # 6.0 a C # 5.0, el compilador lanzará la siguiente excepción La característica 'readonly automatically implemented properties' no está disponible en C# 5. Por favor use idioma versión 6 o superior.

Para cambiar la versión del lenguaje C# visite aquí

Ahora voy a su segunda pregunta

"Esto es solo getter. Pero cuando construyo un constructor, puedo cambiar el valor "

Microsoft introduce las propiedades "readonly implementadas automáticamente" en la lógica de solo lectura. Como sabemos, la palabra clave "readonly" está disponible en C#1.0. usamos la palabra clave "readonly" como modificador en un campo y ese campo se puede asignar en 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 "readonly automatically implemented properties" se puede asignar de 2 maneras

Way1 (en el momento de la declaración):

public string FirstName { get; } = "Banketeshvar";

Way2 (en un constructor de la misma clase)

Person()
{
 FirstName  = "Banketeshvar";
}

Propiedad puramente de lectura

Si está buscando una propiedad puramente de lectura, vaya a esto

public string FullName => "Manish Sharma";

Ahora no se puede asignar el valor de la propiedad "FullName" del constructor. Si intenta hacer eso, lanzará las siguientes excepciones

"Propiedad o Persona del indexador.FullName 'no se puede asignar a {es de solo lectura"

 3
Author: Banketeshvar Narayan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-21 20:50:42

Una variable declarada readonly se puede escribir dentro de un constructor, pero en lenguajes que honren el atributo, no se puede modificar después de que el constructor regrese. Ese calificador se proporcionó como una característica de 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 se inicie el constructor), pero no tendrá que cambiar después de que los constructores regresen, pero solo se puede usar para variables expuestas como campos. El la semántica de los campos calificados readonly 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 las propiedades automáticas de lectura-escritura existen para permitir que las clases expongan propiedades mutables tan fácilmente como los campos ordinarios, las propiedades automáticas de solo lectura existen para permitir que las clases expongan propiedades inmutables tan fácilmente como los campos calificados de readonly. Al igual que readonly - campos calificados pueden ser escrito en un constructor, también con propiedades get-only.

 1
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-12 22:25:29