Saltar al contenido

Declarar e inicializar las propiedades del auto de sólo lectura en C#

Estos dos conceptos giran en torno a la idea de la abstracción. Con una clase, puedes tener campos y propiedades. Los campos son miembros variables normales. Las propiedades son abstracciones que permiten obtener o incluso establecer sus valores.

Veamos un ejemplo de campos. Tenemos un servidor de clase ServerFieldDemo con dos miembros.

Declarar e inicializar las propiedades del auto de sólo lectura en C#
Declarar e inicializar las propiedades del auto de sólo lectura en C#
12345678910publicclassServerFieldDemo{privatestring _Nombre;privatestring _Función;publicServerFieldDemo(nombre de la cadena,función de la cadena){esto._Función = función;esto._Nombre = nombre;}}

csharp

Cuando se definen los campos, hay que asegurarse de definirlos como privados, ya que así se garantiza que no se viola el concepto de encapsulación . La encapsulación, en definitiva, significa que se están agrupando los campos o datos con métodos y funciones que son capaces de manipularlos sin exponerlos a una manipulación directa. Este código actual no es suficiente ya que no es capaz de recuperar estos miembros.

Para impregnar nuestra clase con propiedades, también llamadas accessors , modifique la clase de la siguiente manera.

123456789101112publicclassServerFieldDemo{privatestring _Nombre;privatestring _Función;publicstring Name {get{return _Name;}set{_Name =value;}}publicstring Function {get{return _Function;}set{ _Function =value;}}publicServerFieldDemo(string name,string function){esto. Función = función;esto._Nombre = nombre;}}

csharp

Ahora tienes la opción de leer y modificar las propiedades. Llama al código.

12345ServerFieldDemo a =newServerFieldDemo("pikkolo", "Controlador de Dominio");Console.WriteLine($"El nombre es: {a.Nombre} y la función es: {a.Función}");a.Nombre ="songoku";a.Función ="Servidor DNS";Console.WriteLine($"El nombre es: {a.Nombre} y la función es: {a.Función}");

csharp

Debería ver el siguiente resultado al ser ejecutado.

12el nombre es: pikkolo y la función es: Controlador de DominioEl nombre es: songoku y la función es: Servidor DNS

bash

Se ha inicializado la clase con la ayuda del constructor, y los campos se han cambiado con la ayuda de los accesorios de la propiedad. También has obedecido el principio de encapsulación. Ahora que has aclarado los conceptos, condimenta el aspecto de sólo lectura.

Para crear un campo de sólo lectura, utilice la palabra clave de sólo lectura en la definición.

12345678910publicclassServerFieldDemo{readonlystring _Nombre;readonlystring _Función;publicServerFieldDemo(nombre de la cadena,función de la cadena){esta._Función = función;esta._Nombre = nombre;}}

csharp

En el caso de un miembro del campo, sólo tienes una oportunidad de inicializar el campo con un valor, y es cuando llamas al constructor de la clase. Más allá de eso, obtendrás un error por tal intento. El problema con la clase anterior es que no puedes acceder a los campos. Necesitas encontrar una solución para eso. Todavía quieres tener en cuenta el aspecto de sólo lectura, así que la propiedad sólo puede ser recuperada para la clase pero no modificada. Con una pequeña modificación del código, puedes demostrarlo.

1234567891011publicclassServerFieldDemo{privatestring _Nombre;privatestring _Función;publicstring Name {get{return _Name;}}publicstring Function {get{return _Function;}}publicServerFieldDemo(string name,string function){ _Nombre = nombre; _Function = function;}}

csharp

Ahora toma la clase para una prueba de manejo.

12ServerFieldDemo a =newServerFieldDemo("pikkolo", "Controlador de Dominio");Console.WriteLine($"El nombre: {a.Nombre}, función: {a.Función}");

csharp

La salida del código es la siguiente.

1El nombre: pikkolo, función: Controlador del dominio

bash

Si intentas renombrar la clase de esta manera…

1a.Name ="Nuevo Nombre";

csharp

…el compilador mostrará el siguiente error.

1CS0200 La propiedad o el indexador $0027ServerFieldDemo.Name$0027 no puede ser asignado a -- es sólo de lectura 

bash

La razón de esto es que se omitió el setter en la definición de la propiedad, y ahora sólo se puede acceder pero no modificar la propiedad más profundamente dentro del campo de la clase.

Este cambio permite mantener la estructura interna de la clase intacta y evitar cualquier modificación. En definitiva, si quieres crear propiedades de sólo lectura, sólo tienes que omitir la definición del configurador en esa propiedad específica, mientras te aseguras de que el campo permanece privado para no violar el principio de encapsulación.