Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tutorial] C# Indizadores. Accedé a cualquier Archivo con este Tutorial
#1
Tutorial de indizadores
Visual Studio .NET 2003
Este tutorial muestra cómo las clases de C# pueden declarar indizadores para ofrecer un acceso similar al de las matrices a las clases.

Archivos de ejemplo

Vea Ejemplo de indizadores para descargar y generar los archivos de ejemplo que se utilizan en este tutorial.

Información adicional

Indizadores
Descriptores de acceso
Comparación entre propiedades e indizadores
10.8 Indizadores
10.8.1 Sobrecarga de indizadores
Tutorial

Mediante un indizador se pueden crear clases que actúan como "matrices virtuales". El acceso a las instancias de esas clases se consigue mediante el operador de acceso de matrices []. Definir un indizador en C# es similar a definir el operador [] en C++, pero es mucho más flexible. Para las clases que encapsulan funcionalidad de matrices o colecciones, el uso de un indizador permite a los usuarios de esa clase utilizar la sintaxis de matrices para obtener acceso a la clase.

Por ejemplo, suponga que desea definir una clase que haga que un archivo parezca una matriz de bytes. Si el archivo fuera muy grande, no sería práctico leerlo completo y almacenarlo en memoria, especialmente si sólo se desean leer o cambiar unos pocos bytes. Si se define una clase FileByteArray, se puede conseguir que el archivo se comporte como una matriz de bytes, aunque realmente se realicen operaciones de entrada y salida propias de un archivo al leer o escribir un byte.

Además del ejemplo siguiente, este tutorial trata un tema avanzado sobre la creación de una propiedad indizada.

Ejemplo

En este ejemplo, la clase FileByteArray hace posible obtener acceso a un archivo como si fuera una matriz de bytes. La clase Reverse invierte los bytes del archivo. Puede ejecutar este programa para invertir los bytes de cualquier archivo de texto, incluido el propio archivo de código fuente del programa. Para restablecer el archivo invertido a su estado normal, ejecute el programa sobre el mismo archivo otra vez.

// indexer.cs
// arguments: indexer.txt
using System;
using System.IO;

// Class to provide access to a large file
// as if it were a byte array.
public class FileByteArray
{
Stream stream; // Holds the underlying stream
// used to access the file.
// Create a new FileByteArray encapsulating a particular file.
public FileByteArray(string fileName)
{
stream = new FileStream(fileName, FileMode.Open);
}

// Close the stream. This should be the last thing done
// when you are finished.
public void Close()
{
stream.Close();
stream = null;
}

// Indexer to provide read/write access to the file.
public byte this[long index] // long is a 64-bit integer
{
// Read one byte at offset index and return it.
get
{
byte[] buffer = new byte[1];
stream.Seek(index, SeekOrigin.Begin);
stream.Read(buffer, 0, 1);
return buffer[0];
}
// Write one byte at offset index and return it.
set
{
byte[] buffer = new byte[1] {value};
stream.Seek(index, SeekOrigin.Begin);
stream.Write(buffer, 0, 1);
}
}

// Get the total length of the file.
public long Length
{
get
{
return stream.Seek(0, SeekOrigin.End);
}
}
}

// Demonstrate the FileByteArray class.
// Reverses the bytes in a file.
public class Reverse
{
public static void Main(String[] args)
{
// Check for arguments.
if (args.Length == 0)
{
Console.WriteLine("indexer <filename>");
return;
}

FileByteArray file = new FileByteArray(args[0]);
long len = file.Length;

// Swap bytes in the file to reverse it.
for (long i = 0; i < len / 2; ++i)
{
byte t;

// Note that indexing the "file" variable invokes the
// indexer on the FileByteStream class, which reads
// and writes the bytes in the file.
t = file[i];
file[i] = file[len - i - 1];
file[len - i - 1] = t;
}

file.Close();
}
}
Archivo de entrada: indexer.txt

Para comprobar el programa, puede utilizar un archivo de texto con el siguiente contenido (este archivo se denomina Test.txt en el Ejemplo de indizadores).

public class Hello1
{
public static void Main()
{
System.Console.WriteLine("Hello, World!");
}
}
Para invertir los bytes de este archivo, compile el programa y, a continuación, utilice la línea de comandos:

indexer indexer.txt
Para mostrar el archivo invertido, ejecute el comando:

Type indexer.txt
Resultados del ejemplo

}
}
Guiño"!dlroW ,olleH"(eniLetirW.elosnoC.metsyS
{
)(niaM diov citats cilbup
{
1olleH ssalc cilbup
Descripción del código

Un indizador no necesita nombre, ya que el acceso a él se realiza mediante el operador []. Para conocer la sintaxis de la declaración de indizadores, vea Indizadores.
En el ejemplo anterior, el indizador es del tipo byte y utiliza un único índice de tipo long (entero de 64 bits). El descriptor de acceso Get define el código para leer un byte del archivo, mientras que el descriptor Set define el código para escribir un byte en el archivo. Dentro del descriptor de acceso Set, el valor predefinido del parámetro es el del valor que se está asignando al elemento de la matriz virtual.
Un indizador debe tener al menos un parámetro. Aunque es comparativamente poco común, un indizador puede utilizar más de un parámetro para simular una "matriz virtual" multidimensional. Los parámetros de un indizador suelen ser integrales, pero también pueden ser de cualquier otro tipo. Por ejemplo, la clase Dictionary estándar proporciona un indizador con un parámetro de tipo Object.
Aunque los indizadores constituyen una característica muy versátil, es importante utilizarlos sólo cuando la abstracción similar a una matriz tenga sentido. Considere siempre cuidadosamente si la posibilidad de utilizar métodos normales proporciona la misma claridad. Por ejemplo, el siguiente código muestra un uso inapropiado de un indizador:
class Employee
{
// VERY BAD STYLE: using an indexer to access
// the salary of an employee.
public double this[int year]
{
get
{
// return employee's salary for a given year.
}
}
}
Aunque su uso es válido, un indizador con sólo un descriptor de acceso Get no denota normalmente un buen estilo. En este caso, se debería utilizar preferentemente un método.

Los indizadores se pueden sobrecargar (para obtener más información, vea 10.8.1 Sobrecarga de indizadores).


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
Bug [Duda] Mira este excelente IDE de desarrollo yuma2009 0 62 20-08-2017, 07:37 AM
Último mensaje: yuma2009
Información [Tutorial] Certificado SSL Gratis StartSSL 2016 Tutorial DarkMaster 26 5,130 28-04-2016, 03:39 AM
Último mensaje: Lob3zNo
Bombilla [Tutorial] SSL Gratis, Conseguir e Instalar Certificado DarkMaster 16 873 06-01-2016, 01:32 AM
Último mensaje: DarkMaster
Bombilla [Tutorial] Cómo utilizar Javascript para reproducir un archivo R0bert0 0 277 05-12-2015, 10:02 PM
Último mensaje: R0bert0
  No se descargan archivo por ftp efbsfcd 0 111 29-10-2015, 08:09 AM
Último mensaje: efbsfcd
  ¿Este código es malicioso? bseca 3 285 07-09-2015, 07:59 PM
Último mensaje: Minenage
  [PHP] Leer y mostrar archivo de texto torgar22 0 432 28-02-2015, 02:36 PM
Último mensaje: torgar22
  [PUBLICO] Tutorial Botones con perspectiva 3D AngelKrak 0 235 17-01-2015, 05:44 AM
Último mensaje: AngelKrak
  Crear un archivo excel (.xls) con PHP jlgarduza 3 505 23-11-2014, 10:48 PM
Último mensaje: Joseahfer
  [Duda] Abrir enlace al dar click en cualquier sitio Tamatsipatse 1 385 22-11-2014, 08:26 PM
Último mensaje: AbaddonOrmuz



Usuarios navegando en este tema: 1 invitado(s)