AYUDA .NET

Indexadores de C# (Cómo funciona para desarrolladores)

Publicado en 23 de octubre, 2024
Compartir:

Unindexador en C# es un tipo especial de propiedad que permite acceder a las instancias de una clase o estructura mediante el operador de acceso a matrices[]. Los indexadores pueden ser muy útiles para crear "matrices inteligentes" o encapsular datos en una sintaxis simplificada. Proporcionan una forma de utilizar instancias de una clase del mismo modo que se utilizan las matrices, donde se puede acceder a los datos a través de un índice. Este artículo explorará cómo declarar y utilizar los indexadores de C# con ejemplos prácticos. También exploraremos laBiblioteca IronPDF al final del artículo.

Sintaxis básica del indexador

Un indexador es un miembro de instancia que utiliza la palabra clave 'this' en una clase o estructura, seguida de la declaración del indexador. También se especifican los tipos de parámetros y el tipo de retorno. La sintaxis general de un miembro de instancia de indexador es la siguiente:

public return_type this[parameter_type index]
{
    get
    {
        // code to return data
    }
    set
    {
        // set accessor, code to set data
    }
}
public return_type this[parameter_type index]
{
    get
    {
        // code to return data
    }
    set
    {
        // set accessor, code to set data
    }
}
Default Public Property Item(ByVal index As parameter_type) As return_type
	Get
		' code to return data
	End Get
	Set(ByVal value As return_type)
		' set accessor, code to set data
	End Set
End Property
VB   C#

Aquí, return_type es el tipo de valor que devolverá el indexador, como un valor entero, y parameter_type es el tipo del índice, a menudo un int. El accesor get devuelve el valor en el índice especificado, y el accesor set block code asigna un valor a ese índice.

Declaración y uso del indexador

Examinaremos una ilustración básica de la implementación de un indexador dentro de una clase C#. Consideremos una clase Program que encapsula una matriz de cadenas.

class Program
{
    private string[] values = new string[5]; // Array with 5 elements
    public string this[int index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[index] = value;
        }
    }
}
class Program
{
    private string[] values = new string[5]; // Array with 5 elements
    public string this[int index]
    {
        get
        {
            return values[index];
        }
        set
        {
            values[index] = value;
        }
    }
}
Friend Class Program
	Private values(4) As String ' Array with 5 elements
	Default Public Property Item(ByVal index As Integer) As String
		Get
			Return values(index)
		End Get
		Set(ByVal value As String)
			values(index) = value
		End Set
	End Property
End Class
VB   C#

En el código anterior:

  • La clase Program contiene una matriz de cadenas denominada values.
  • La cadena[int índice] es la declaración del indexador, donde el índice int es la propiedad parametrizada index utilizada para acceder a los elementos del array.
  • El accesor get devuelve el valor indexado en el índice especificado, y el accesor set asigna un valor indexado a ese índice.
  • El accesorio set establece el valor en el índice dado.

    Esto significa que puede crear una instancia de la clase Program y acceder a su matriz de valores utilizando el indexador, de esta manera:

class Program
{
    static void Main()
    {
        Program program = new Program();
        // Set values using indexer
        program[0] = "First";
        program[1] = "Second";
        // Access values using indexer
        Console.WriteLine(program[0]); // Output: First
        Console.WriteLine(program[1]); // Output: Second
    }
}
class Program
{
    static void Main()
    {
        Program program = new Program();
        // Set values using indexer
        program[0] = "First";
        program[1] = "Second";
        // Access values using indexer
        Console.WriteLine(program[0]); // Output: First
        Console.WriteLine(program[1]); // Output: Second
    }
}
Friend Class Program
	Shared Sub Main()
		Dim program As New Program()
		' Set values using indexer
		program(0) = "First"
		program(1) = "Second"
		' Access values using indexer
		Console.WriteLine(program(0)) ' Output: First
		Console.WriteLine(program(1)) ' Output: Second
	End Sub
End Class
VB   C#

En este código, puedes ver que el indexador proporciona una sintaxis simple para acceder a la matriz de valores, similar a cómo accederías a los elementos de una matriz.

Comprensión de los accesorios get y set

Los accesores get y set dentro del indexador son como código de bloque que permite recuperar y asignar datos de forma similar a como se haría con las propiedades. La principal diferencia es que los indexadores utilizan un parámetro de índice para trabajar con colecciones de datos en lugar de con miembros de datos individuales.

El bloque get se encarga de devolver los datos en el índice especificado, mientras que el bloque set asigna datos al índice especificado. He aquí otro ejemplo para que lo entiendas mejor:

class StudentRecords
{
    private string[] studentNames = new string[3];
    public string this[int index]
    {
        get
        {
            if (index >= 0 && index < studentNames.Length)
            {
                return studentNames[index];
            }
            return "Invalid Index";
        }
        set
        {
            if (index >= 0 && index < studentNames.Length)
            {
                studentNames[index] = value;
            }
        }
    }
    public int Length
    {
        get { return studentNames.Length; }
    }
}
class StudentRecords
{
    private string[] studentNames = new string[3];
    public string this[int index]
    {
        get
        {
            if (index >= 0 && index < studentNames.Length)
            {
                return studentNames[index];
            }
            return "Invalid Index";
        }
        set
        {
            if (index >= 0 && index < studentNames.Length)
            {
                studentNames[index] = value;
            }
        }
    }
    public int Length
    {
        get { return studentNames.Length; }
    }
}
Friend Class StudentRecords
	Private studentNames(2) As String
	Default Public Property Item(ByVal index As Integer) As String
		Get
			If index >= 0 AndAlso index < studentNames.Length Then
				Return studentNames(index)
			End If
			Return "Invalid Index"
		End Get
		Set(ByVal value As String)
			If index >= 0 AndAlso index < studentNames.Length Then
				studentNames(index) = value
			End If
		End Set
	End Property
	Public ReadOnly Property Length() As Integer
		Get
			Return studentNames.Length
		End Get
	End Property
End Class
VB   C#

En este ejemplo:

  • La clase StudentRecords tiene una cadena privada[] studentNames matriz que contiene los nombres de los estudiantes.
  • El indexador comprueba si el índice está dentro de los límites de la matriz antes de establecer o recuperar el valor.
  • Una propiedad Length de tipo int proporciona acceso a la longitud de la matriz.

    Puede utilizar esta clase en el método Main de la siguiente manera:

class Program
{
    public static void Main()
    {
        StudentRecords records = new StudentRecords();
        // Set values using indexer
        records[0] = "John";
        records[1] = "Jane";
        records[2] = "Bob";
        // Access values using indexer
        for (int i = 0; i < records.Length; i++)
        {
            Console.WriteLine(records[i]);
        }
    }
}
class Program
{
    public static void Main()
    {
        StudentRecords records = new StudentRecords();
        // Set values using indexer
        records[0] = "John";
        records[1] = "Jane";
        records[2] = "Bob";
        // Access values using indexer
        for (int i = 0; i < records.Length; i++)
        {
            Console.WriteLine(records[i]);
        }
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim records As New StudentRecords()
		' Set values using indexer
		records(0) = "John"
		records(1) = "Jane"
		records(2) = "Bob"
		' Access values using indexer
		For i As Integer = 0 To records.Length - 1
			Console.WriteLine(records(i))
		Next i
	End Sub
End Class
VB   C#

Creación de un indexador genérico

También puedes crear clases genéricas con indexadores, permitiendo que tu código maneje múltiples tipos de datos. He aquí un ejemplo sencillo de una clase genérica con un indexador genérico:

class GenericClass<T>
{
    private T[] elements = new T[5];
    public T this[int index]
    {
        get
        {
            return elements[index];
        }
        set
        {
            elements[index] = value;
        }
    }
    public int Length
    {
        get { return elements.Length; }
    }
}
class GenericClass<T>
{
    private T[] elements = new T[5];
    public T this[int index]
    {
        get
        {
            return elements[index];
        }
        set
        {
            elements[index] = value;
        }
    }
    public int Length
    {
        get { return elements.Length; }
    }
}
Friend Class GenericClass(Of T)
	Private elements(4) As T
	Default Public Property Item(ByVal index As Integer) As T
		Get
			Return elements(index)
		End Get
		Set(ByVal value As T)
			elements(index) = value
		End Set
	End Property
	Public ReadOnly Property Length() As Integer
		Get
			Return elements.Length
		End Get
	End Property
End Class
VB   C#

En este código:

  • La *Clase Genéricala clase * define un indexador que puede trabajar con cualquier tipo de datos.
  • El texto "*este[int índice]el indexador "*" permite acceder a los elementos de la matriz, independientemente de su tipo.

    Ahora puede utilizar la GenericClass con diferentes tipos de datos en el método Main:

class Program
{
    public static void Main()
    {
        GenericClass<int> intArray = new GenericClass<int>();
        intArray[0] = 10;
        intArray[1] = 20;
        GenericClass<string> stringArray = new GenericClass<string>();
        stringArray[0] = "Hello";
        stringArray[1] = "World";
        // Output the integer array values
        for (int i = 0; i < intArray.Length; i++)
        {
            Console.WriteLine(intArray[i]);
        }
        // Output the string array values
        for (int i = 0; i < stringArray.Length; i++)
        {
            Console.WriteLine(stringArray[i]);
        }
    }
}
class Program
{
    public static void Main()
    {
        GenericClass<int> intArray = new GenericClass<int>();
        intArray[0] = 10;
        intArray[1] = 20;
        GenericClass<string> stringArray = new GenericClass<string>();
        stringArray[0] = "Hello";
        stringArray[1] = "World";
        // Output the integer array values
        for (int i = 0; i < intArray.Length; i++)
        {
            Console.WriteLine(intArray[i]);
        }
        // Output the string array values
        for (int i = 0; i < stringArray.Length; i++)
        {
            Console.WriteLine(stringArray[i]);
        }
    }
}
Friend Class Program
	Public Shared Sub Main()
		Dim intArray As New GenericClass(Of Integer)()
		intArray(0) = 10
		intArray(1) = 20
		Dim stringArray As New GenericClass(Of String)()
		stringArray(0) = "Hello"
		stringArray(1) = "World"
		' Output the integer array values
		For i As Integer = 0 To intArray.Length - 1
			Console.WriteLine(intArray(i))
		Next i
		' Output the string array values
		For i As Integer = 0 To stringArray.Length - 1
			Console.WriteLine(stringArray(i))
		Next i
	End Sub
End Class
VB   C#

Uso de IronPDF con C#; Indexer

Indexadores C# (Cómo funciona para desarrolladores): Figura 1 - IronPDF

IronPDF es una biblioteca de C# diseñada para generar, editar y convertir archivos PDF en aplicaciones .NET. Simplifica el trabajo con PDF para que los desarrolladorescrear PDF a partir de HTMLlas herramientas para desarrolladores .NET, .Python, .NET, .NET y .NET manipulan archivos PDF y gestionan funcionalidades avanzadas como la fusión, la impresión y la adición de firmas mediante programación.

Puede aprovechar IronPDF en sus programas de C# que utilizan indexadores para generar y gestionar dinámicamente contenido PDF. Por ejemplo, supongamos que tiene una clase que contiene cadenas HTML y desea generar archivos PDF para cada entrada HTML utilizando un indexador. Este enfoque agiliza la generación de PDF al tiempo que mantiene el código organizado e intuitivo.

using IronPdf;
using System;
class PdfGenerator
{
    private string[] htmlTemplates = new string[3];
    public string this[int index]
    {
        get { return htmlTemplates[index]; }
        set { htmlTemplates[index] = value; }
    }
    public void GeneratePdf(int index, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this[index]); // Access HTML string using indexer
        pdfDocument.SaveAs(outputPath);
    }
}
class Program
{
    public static void Main()
    {
        PdfGenerator pdfGen = new PdfGenerator();
        // Populate HTML templates
        pdfGen[0] = "<h1>First Document</h1><p>This is the first PDF.</p>";
        pdfGen[1] = "<h1>Second Document</h1><p>This is the second PDF.</p>";
        pdfGen[2] = "<h1>Third Document</h1><p>This is the third PDF.</p>";
        // Generate PDFs using the indexer
        pdfGen.GeneratePdf(0, "first.pdf");
        pdfGen.GeneratePdf(1, "second.pdf");
        pdfGen.GeneratePdf(2, "third.pdf");
        Console.WriteLine("PDFs generated successfully.");
    }
}
using IronPdf;
using System;
class PdfGenerator
{
    private string[] htmlTemplates = new string[3];
    public string this[int index]
    {
        get { return htmlTemplates[index]; }
        set { htmlTemplates[index] = value; }
    }
    public void GeneratePdf(int index, string outputPath)
    {
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(this[index]); // Access HTML string using indexer
        pdfDocument.SaveAs(outputPath);
    }
}
class Program
{
    public static void Main()
    {
        PdfGenerator pdfGen = new PdfGenerator();
        // Populate HTML templates
        pdfGen[0] = "<h1>First Document</h1><p>This is the first PDF.</p>";
        pdfGen[1] = "<h1>Second Document</h1><p>This is the second PDF.</p>";
        pdfGen[2] = "<h1>Third Document</h1><p>This is the third PDF.</p>";
        // Generate PDFs using the indexer
        pdfGen.GeneratePdf(0, "first.pdf");
        pdfGen.GeneratePdf(1, "second.pdf");
        pdfGen.GeneratePdf(2, "third.pdf");
        Console.WriteLine("PDFs generated successfully.");
    }
}
Imports IronPdf
Imports System
Friend Class PdfGenerator
	Private htmlTemplates(2) As String
	Default Public Property Item(ByVal index As Integer) As String
		Get
			Return htmlTemplates(index)
		End Get
		Set(ByVal value As String)
			htmlTemplates(index) = value
		End Set
	End Property
	Public Sub GeneratePdf(ByVal index As Integer, ByVal outputPath As String)
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(Me(index)) ' Access HTML string using indexer
		pdfDocument.SaveAs(outputPath)
	End Sub
End Class
Friend Class Program
	Public Shared Sub Main()
		Dim pdfGen As New PdfGenerator()
		' Populate HTML templates
		pdfGen(0) = "<h1>First Document</h1><p>This is the first PDF.</p>"
		pdfGen(1) = "<h1>Second Document</h1><p>This is the second PDF.</p>"
		pdfGen(2) = "<h1>Third Document</h1><p>This is the third PDF.</p>"
		' Generate PDFs using the indexer
		pdfGen.GeneratePdf(0, "first.pdf")
		pdfGen.GeneratePdf(1, "second.pdf")
		pdfGen.GeneratePdf(2, "third.pdf")
		Console.WriteLine("PDFs generated successfully.")
	End Sub
End Class
VB   C#

Indexadores C# (Cómo funciona para desarrolladores): Figura 2 - Salida de la consola

Conclusión

Los indexadores de C# son una función útil que te ayuda a hacer que tus clases y structs se comporten como arrays. Al proporcionar una sintaxis simplificada y un acceso flexible a los datos, se puede crear un código más intuitivo y legible. Tanto si trabaja con cadenas como con enteros o cualquier otro tipo de datos, los indexadores le ofrecen la posibilidad de encapsular su estructura de datos y acceder a ella mediante índices de forma limpia y eficaz.

IronPDF hace que sea fácil empezar con unprueba gratuita que le da acceso a todas las funciones que necesita para crear, manipular y renderizar PDF. Puedes tomarte tu tiempo explorando el software, y una vez que estés satisfecho, las licencias están disponibles a partir de 749 $.

< ANTERIOR
Nuevo GUID de C# (Cómo funciona para desarrolladores)
SIGUIENTE >
C# foreach with index (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.12 acaba de salir

Descarga gratuita de NuGet Descargas totales: 11,622,374 Ver licencias >