-
Colección del proceso de implementación del indexador en C#
Uno de los aspectos más interesantes del lenguaje C# es el indexador de clases. En pocas palabras, el llamado indexador es un tipo especial de atributo a través del cual puede hacer referencia a su propia clase como si fuera una matriz. Obviamente, esta característica es particularmente útil al crear clases de colección, pero en otras situaciones, como procesar archivos grandes o abstraer ciertos recursos limitados, también es muy útil tener un comportamiento similar a una matriz en una clase. Este artículo le guiará en la configuración de una clase para utilizar un indexador. Pero primero, describamos el concepto de propiedades para proporcionar algunos antecedentes necesarios.
Propiedades Si alguna vez ha escrito un programa en VB6, entonces debería estar muy familiarizado con los métodos de propiedad. Los llamados métodos de propiedad son en realidad miembros de clase especiales que implementan acceso controlado a campos de clase privados. Hay dos métodos de atributos en el lenguaje C#: uno es obtener, a través del cual se puede devolver el valor del campo privado, y el segundo es establecer, a través del cual se puede establecer el valor del campo privado. Por ejemplo, tomando el siguiente código como ejemplo, se crea una propiedad FirstName para controlar el acceso al nombre del miembro de la clase privada:
clase Persona {
nombre de cadena privada;
cadena pública Nombre {
obtener {return firstname;}
establecer {nombre = valor;}
}
}
Las declaraciones de propiedad se pueden codificar de la siguiente manera:
Persona p = nueva Persona();
p.FirstName = "Lamont";
Console.WriteLine (p.FirstName);
Como puede ver, la declaración de atributos se parece más a una declaración de dominio, excepto que también declara dos miembros especiales, que según Microsoft son los llamados descriptores de acceso. La función de obtención de acceso se llama cuando se llama a una propiedad en el lado derecho de una expresión o cuando la propiedad se usa como parámetro de otra subrutina (o función). Por el contrario, se llama a la función de acceso establecida cuando se llama a la propiedad en el lado izquierdo de la expresión y el valor del campo privado se establece pasando implícitamente el parámetro de valor. Puede crear propiedades de solo lectura omitiendo la función de acceso set, de modo que cualquier intento de establecer la propiedad generará un error de compilación.
Beneficios de usar indexadores
A continuación se muestra su estructura.
...{
conseguir
...{
// Obtener códigos va aquí
}
colocar
...{
// Establecer códigos va aquí
}
}
Nota:
modificador: modificador, como privado, público, protegido o interno
this: Esta es una palabra clave especial en C#, que representa la instancia actual de la clase de referencia. Aquí significa el índice de la clase actual.
lista de argumentos: Esto se refiere a los parámetros del indexador.
Después de hablar durante mucho tiempo, pasemos al tema, entonces, ¿por qué tengo que dar vueltas en este círculo? De hecho, esto se debe a que el indexador de una clase es muy parecido a una propiedad, y este también es el caso desde el punto de vista del código. A continuación se muestra un ejemplo de una clase con un indexador que devuelve una cadena:
clase muestra {
cadena pública esto [índice int] {
get {return "Aprobaste " + index }
}
}
Tenga en cuenta que el nombre del atributo aquí es este, que se refiere a la instancia actual de la clase, y la lista de parámetros está entre corchetes en lugar de paréntesis. Además, este es un indexador de solo lectura. Para cambiarlo al tipo de lectura/escritura, agregué una función de acceso establecido. Al definir un indexador, no necesariamente se toma solo un parámetro. Los parámetros del indexador pueden ser de cualquier tipo, pero int suele ser el tipo más razonable. También es posible tener más de un indexador (sobrecargado) en la misma clase.
Después de definir la clase Sample como se indicó anteriormente, podemos usar el indexador como atributo predeterminado, como se muestra a continuación:
Muestra s = nueva Muestra();
Consola.WriteLine(s[55]);
Propiedades e indexadores Existen varias diferencias entre propiedades e indexadores:
Cada atributo de la clase debe tener un nombre único y cada indexador definido en la clase debe tener una firma única o una lista de parámetros (para que se pueda implementar la sobrecarga del indexador).
Las propiedades pueden ser estáticas y los indexadores deben ser miembros de instancia.
Las funciones de acceso definidas para los indexadores tienen acceso a los parámetros pasados al indexador, mientras que las funciones de acceso a las propiedades no tienen parámetros.
Los implementadores de programas suelen favorecer el comportamiento similar a una matriz de las interfaces, por lo que también puede definir indexadores para la interfaz. Tanto las interfaces de colección IList como IDictionary declaran indexadores para acceder a sus elementos almacenados.
Al declarar un indexador para una interfaz, recuerde que la declaración solo indica la existencia del indexador. Solo necesita proporcionar las funciones de acceso adecuadas, sin incluir modificadores de alcance. El siguiente código declara el indexador como parte de la interfaz IImplementMe:
interfaz IImplementMe {
cadena esto [índice int]
{
conseguir;
colocar;
}
La clase implementada correspondiente debe definir específicamente las funciones de acceso get y set para el indexador de IimplementMe.
Esa es una descripción básica de los indexadores. Ahora debería comprender mejor el papel que desempeñan los indexadores en su desarrollo.
clase ColecciónMuestra
{
privado T[] arr = nuevo T[100];
público T esto[int i]
{
conseguir
{
retorno llegada[i];
}
colocar
{
arreglo[i] = valor;
}
}
}
// Esta clase muestra cómo el código del cliente usa el indexador
programa de clase
{
vacío estático principal (cadena [] argumentos)
{
SampleCollection
stringCollection[0] = "Hola mundo";
System.Console.WriteLine(stringCollection[0]);
}
}
Este artículo proviene del blog de CSDN. Indique la fuente al reimprimir: http://blog.csdn.net/licheng19891020/archive/2009/12/09/4974516.aspx .
-