-
Cómo usar C# set y get
El lenguaje C# tiene dos funciones: una función de asignación (get) y una función de valor (set), que se pueden ver claramente en el código del lenguaje intermedio que genera. C# no recomienda establecer el nivel de protección del dominio en público y permitir que los usuarios operen arbitrariamente fuera de la clase; eso es demasiado inseguro o, para ser más específico, ¡demasiado inseguro! Para todos los campos que deben ser visibles fuera de la clase, C# recomienda usar atributos para expresarlos. Los atributos no representan ubicaciones de almacenamiento, que es la diferencia fundamental entre atributos y dominios. El siguiente es un diseño de atributos típico:
usando Sistema;
claseMiClase
{
entero entero;
entero público
{
obtener {devolver entero;}
establecer {entero=valor;}
}
}
prueba de clase
{
vacío estático público principal ()
{
MiClase MiObjeto=nueva MiClase();
Consola.Write(MyObject.Integer);
MiObjeto.Integer++;
Consola.Write(MyObject.Integer);
}
}
Como se esperaba, el programa genera 0 1. Podemos ver que los atributos proporcionan a los programadores una interfaz de acceso amigable a los miembros del dominio mediante métodos envolventes. El valor aquí es la palabra clave de C#, que es el parámetro implícito de set cuando realizamos operaciones de atributos, es decir, el rvalue cuando realizamos operaciones de escritura de atributos.
Los atributos proporcionan tres operaciones de interfaz: solo lectura (obtener), solo escritura (establecer) y lectura-escritura (obtener y configurar). Estas tres operaciones en el dominio deben declararse bajo el mismo nombre de atributo y no se pueden separar. Consulte la siguiente implementación:
claseMiClase
{
nombre de cadena privada;
Nombre de cadena pública
{
obtener {devolver nombre}
}
Nombre de cadena pública
{
establecer {nombre = valor}
}
}
¡El método anterior para separar la implementación del atributo Nombre es incorrecto! Deberíamos juntarlos como en el ejemplo anterior. Vale la pena señalar que C# considera que las tres propiedades (solo lectura, solo escritura, lectura-escritura) tienen el mismo nombre de propiedad; consulte el siguiente ejemplo:
claseMiClase
{
protegido int núm=0;
número entero público
{
colocar
{
número=valor;
}
}
}
clase MiClaseDerivada: MiClase
{
nuevo número int público
{
conseguir
{
devolver número;
}
}
}
prueba de clase
{
vacío estático público principal ()
{
MiClaseDerivada MiObjeto = nueva MiClaseDerivada();
//MiObjeto.Num= 1; //¡Error!
((MiClase)MiObjeto).Núm = 1;
}
}
Podemos ver que el atributo Num-get{} en MyClassDerived bloquea la definición del atributo Num-set{} en MyClass.
Por supuesto, los atributos son mucho más que simples operaciones de interfaz de dominio. La esencia de los atributos siguen siendo los métodos. Podemos realizar ciertas comprobaciones, advertencias y otras operaciones adicionales basadas en la lógica del programa al extraer o asignar atributos.
claseMiClase
{
nombre de cadena privada;
Nombre de cadena pública
{
obtener {devolver nombre}
colocar
{
si (valor==nulo)
nombre="Microsoft";
demás
nombre=valor;
}
}
}
Debido a la naturaleza del método de atributos, por supuesto, los atributos también tienen varias modificaciones de métodos. Los atributos también tienen 5 modificadores de acceso, pero los modificadores de acceso de los atributos suelen ser públicos; de lo contrario, perderemos el significado de los atributos como interfaces públicas de clases. Además de la falta de atributos característicos, como la sobrecarga de métodos provocada por múltiples parámetros del método, los modificadores como virtual, sellado, anulación y abstracto tienen el mismo comportamiento para atributos y métodos, porque los atributos se implementan esencialmente como dos métodos. , Ciertos comportamientos requieren nuestra atención. Mira el siguiente ejemplo:
clase abstracta A
{
int y;
público virtual int X
{
obtener {regresar 0}
}
público virtual int Y
{
obtener {regresar y}
establecer { y = valor }
}
resumen público int Z {obtener; establecer}
}
clase B: A
{
intz;
anulación pública int X
{
obtener {return base.X + 1;
}
anulación pública int Y
{
establecer { base.Y = valor < 0? 0: valor }
}
anulación pública int Z
{
obtener {regresar z}
establecer { z = valor }
}
}
Este ejemplo destaca algunos comportamientos típicos de las propiedades en el contexto de la herencia. Aquí, la clase A debe declararse abstracta debido a la existencia del atributo abstracto Z. La subclase B se refiere a los atributos de la clase principal A a través de la palabra clave base. La clase B puede sobrescribir los atributos virtuales de la clase A sólo mediante Y-set.
Las propiedades estáticas, como los métodos estáticos, solo pueden acceder a variables de dominio estático de la clase. También podemos declarar propiedades externas tal como lo hacemos con métodos externos.