Indexadores (this[])
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy — lección 37 de 70.
Los indizadores le permiten acceder a los elementos de su clase utilizando una notación de corchetes similar a la de los arreglos. En lugar de llamar a un método como collection.GetItem(0), puede escribir el más intuitivo collection[0].
Se define un indizador utilizando la palabra clave this con corchetes:
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Ahora puedes acceder a las palabras de forma natural:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hola
s[1] = "C#";
Console.WriteLine(s[1]); // C#Los indizadores no están limitados a enteros. Puede usar cualquier tipo como parámetro de índice, lo que los hace útiles para el acceso de tipo diccionario:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Al igual que las propiedades, los indizadores pueden ser de solo lectura (omitiendo el setter) o incluir lógica de validación en sus descriptores de acceso. Son ideales cuando su clase envuelve una colección o cuando la notación de corchetes hace que el código sea más legible.
Desafío
FácilVamos a construir una clase Playlist que te permita acceder a las canciones utilizando una notación de corchetes intuitiva, tal como si trabajaras con un array. Crearás una lista de reproducción de música donde las canciones se pueden recuperar y actualizar por su posición utilizando un indexador.
Organizarás tu código en dos archivos:
Playlist.cs: Crea una clasePlaylisten el espacio de nombresMusicque envuelva una colección interna de canciones y proporcione acceso tipo array a través de un indexador. Tu lista de reproducción debe tener:- Un array de cadenas privado para almacenar los títulos de las canciones
- Un constructor que acepte una cadena de títulos de canciones separados por comas y la divida en el array interno
- Un indexador usando
this[int index]que permita tanto obtener como establecer canciones en una posición específica - Una propiedad de solo lectura
Countque devuelva el número de canciones en la lista de reproducción - Un método
GetAllSongs()que devuelva todas las canciones unidas por" | "
Program.cs: En tu archivo principal, crea una lista de reproducción a partir de la entrada, luego usa el indexador para acceder y modificar canciones. Demuestra tanto la lectura de canciones por índice como la actualización de una canción en una posición específica.
Recibirás tres entradas:
- Una lista de títulos de canciones separados por comas (por ejemplo,
Song A,Song B,Song C) - Un índice para recuperar (entero)
- Un nuevo título de canción para reemplazar la canción en ese mismo índice
Imprime la salida en este formato:
Total songs: {Count}
Song at index {index}: {song title}
After update: {GetAllSongs()}Por ejemplo, si las entradas son Rock Anthem,Jazz Vibes,Pop Hit, 1, y Blues Classic, la salida debería ser:
Total songs: 3
Song at index 1: Jazz Vibes
After update: Rock Anthem | Blues Classic | Pop HitObserva cómo el indexador te permite acceder a playlist[1] para obtener "Jazz Vibes" y luego asignar playlist[1] = "Blues Classic" para actualizarlo, ¡mucho más natural que llamar a métodos como GetSongAt(1) o SetSongAt(1, "Blues Classic")!
Hoja de referencia
Los indizadores le permiten acceder a los elementos de su clase utilizando la notación de corchetes similar a la de un array (collection[0]) en lugar de llamadas a métodos.
Defina un indizador utilizando la palabra clave this con corchetes:
public class Sentence
{
private string[] words;
public Sentence(string text)
{
words = text.Split(' ');
}
public string this[int index]
{
get { return words[index]; }
set { words[index] = value; }
}
}Ejemplo de uso:
Sentence s = new Sentence("Hello World");
Console.WriteLine(s[0]); // Hello
s[1] = "C#";
Console.WriteLine(s[1]); // C#Los indizadores pueden utilizar cualquier tipo como parámetro de índice, no solo enteros:
public string this[string key]
{
get { return dictionary[key]; }
set { dictionary[key] = value; }
}Al igual que las propiedades, los indizadores pueden ser de solo lectura (omitiendo el setter) o incluir lógica de validación en sus descriptores de acceso.
Pruébalo tú mismo
using System;
using Music;
class Program
{
public static void Main(string[] args)
{
// Leer entradas
string songList = Console.ReadLine();
int index = Convert.ToInt32(Console.ReadLine());
string newSong = Console.ReadLine();
// TODO: Crear un objeto Playlist a partir de songList
// TODO: Imprimir el número total de canciones usando la propiedad Count
// TODO: Imprimir la canción en el índice dado usando el indexador
// TODO: Actualizar la canción en el índice dado usando el indexador
// TODO: Imprimir todas las canciones después de la actualización usando GetAllSongs()
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes