Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
[Tutorial] C# Propiedades Indizadas [Intermedio]
#1
Tutorial de propiedades indizadas
Visual Studio .NET 2003
Este tutorial muestra cómo implementar una clase que utiliza propiedades indizadas. Las propiedades indizadas permiten utilizar una clase que representa una colección, semejante a una matriz, de diferentes tipos de elementos. Debería completar el Tutorial de indizadores antes de trabajar con este tutorial.

Archivos de ejemplo

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

Información adicional

Indizadores
Descriptores de acceso
Tutorial de indizadores
10.8 Indizadores
10.8.1 Sobrecarga de indizadores
Tutorial

Suponga que desea escribir una clase, Document, que encapsula una sección larga de texto. Para conseguir una fácil implementación de diversas operaciones como, por ejemplo, la corrección ortográfica, es recomendable ver el documento como una matriz virtual de palabras, así como de caracteres.

El siguiente ejemplo muestra una técnica para implementar esa clase. Para cada "propiedad indizada" se define una clase anidada, que contiene una referencia a la instancia de la clase principal. Un campo con acceso readonly en la clase principal proporciona acceso a una instancia de la clase anidada que define cada matriz virtual. Cada una de las clases anidadas define un indizador, así como otros métodos semejantes a los de las colecciones (por ejemplo, una propiedad Count). El siguiente ejemplo muestra estas características para las propiedades "Words" y "Characters".

Nota Utilice esta técnica con moderación. Utilice sólo este modelo si la abstracción que proporciona el uso de operaciones de indización de matrices clarifica significativamente el código que utiliza la clase y si los indizadores disponen de los descriptores de acceso Get y Set.
Ejemplo

En este ejemplo, se define la clase Document. Se utilizan dos propiedades indizadas, Words y Characters, para realizar algunas operaciones de texto sobre el objeto Document.

// indexedproperty.cs
using System;

public class Document
{
// Type allowing the document to be viewed like an array of words:
public class WordCollection
{
readonly Document document; // The containing document

internal WordCollection(Document d)
{
document = d;
}

// Helper function -- search character array "text", starting at
// character "begin", for word number "wordCount." Returns false
// if there are less than wordCount words. Sets "start" and
// length" to the position and length of the word within text:
private bool GetWord(char[] text, int begin, int wordCount,
out int start, out int length)
{
int end = text.Length;
int count = 0;
int inWord = -1;
start = length = 0;

for (int i = begin; i <= end; ++i)
{
bool isLetter = i < end && Char.IsLetterOrDigit(text[i]);

if (inWord >= 0)
{
if (!isLetter)
{
if (count++ == wordCount)
{
start = inWord;
length = i - inWord;
return true;
}
inWord = -1;
}
}
else
{
if (isLetter)
inWord = i;
}
}
return false;
}

// Indexer to get and set words of the containing document:
public string this[int index]
{
get
{
int start, length;
if (GetWord(document.TextArray, 0, index, out start,
out length))
return new string(document.TextArray, start, length);
else
throw new IndexOutOfRangeException();
}
set
{
int start, length;
if (GetWord(document.TextArray, 0, index, out start,
out length))
{
// Replace the word at start/length with the
// string "value":
if (length == value.Length)
{
Array.Copy(value.ToCharArray(), 0,
document.TextArray, start, length);
}
else
{
char[] newText =
new char[document.TextArray.Length +
value.Length - length];
Array.Copy(document.TextArray, 0, newText,
0, start);
Array.Copy(value.ToCharArray(), 0, newText,
start, value.Length);
Array.Copy(document.TextArray, start + length,
newText, start + value.Length,
document.TextArray.Length - start
- length);
document.TextArray = newText;
}
}
else
throw new IndexOutOfRangeException();
}
}

// Get the count of words in the containing document:
public int Count
{
get
{
int count = 0, start = 0, length = 0;
while (GetWord(document.TextArray, start + length, 0,
out start, out length))
++count;
return count;
}
}
}

// Type allowing the document to be viewed like an "array"
// of characters:
public class CharacterCollection
{
readonly Document document; // The containing document

internal CharacterCollection(Document d)
{
document = d;
}

// Indexer to get and set characters in the containing document:
public char this[int index]
{
get
{
return document.TextArray[index];
}
set
{
document.TextArray[index] = value;
}
}

// Get the count of characters in the containing document:
public int Count
{
get
{
return document.TextArray.Length;
}
}
}

// Because the types of the fields have indexers,
// these fields appear as "indexed properties":
public readonly WordCollection Words;
public readonly CharacterCollection Characters;

private char[] TextArray; // The text of the document.

public Document(string initialText)
{
TextArray = initialText.ToCharArray();
Words = new WordCollection(this);
Characters = new CharacterCollection(this);
}

public string Text
{
get
{
return new string(TextArray);
}
}
}

class Test
{
static void Main()
{
Document d = new Document(
"peter piper picked a peck of pickled peppers. How many pickled peppers did peter piper pick?"
);

// Change word "peter" to "penelope":
for (int i = 0; i < d.Words.Count; ++i)
{
if (d.Words[i] == "peter")
d.Words[i] = "penelope";
}

// Change character "p" to "P"
for (int i = 0; i < d.Characters.Count; ++i)
{
if (d.Characters[i] == 'p')
d.Characters[i] = 'P';
}

Console.WriteLine(d.Text);
}
}
Resultado

PeneloPe PiPer Picked a Peck of Pickled PePPers. How many Pickled PePPers did PeneloPe PiPer Pick?


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
Información [Tutorial] Certificado SSL Gratis StartSSL 2016 Tutorial DarkMaster 26 5,118 28-04-2016, 03:39 AM
Último mensaje: Lob3zNo
Bombilla [Tutorial] SSL Gratis, Conseguir e Instalar Certificado DarkMaster 16 872 06-01-2016, 01:32 AM
Último mensaje: DarkMaster
  [PUBLICO] Tutorial Botones con perspectiva 3D AngelKrak 0 234 17-01-2015, 05:44 AM
Último mensaje: AngelKrak
  [Tutorial] Aumentar el Tamaño Máximo al Cargar Archivos con PHP y Apache papanoel 0 669 22-01-2014, 04:38 AM
Último mensaje: papanoel
  Tutorial Css Primera Parte para phpost JNeutron 4 1,053 24-02-2013, 04:01 AM
Último mensaje: Echizen
  [TUTORIAL] Conexión a una Base de Datos desde [PHP] lapipichapa 0 491 15-02-2013, 05:52 PM
Último mensaje: lapipichapa
  Tutorial de .htaccess | Control de acceso a carpetas diringax 11 1,454 13-01-2013, 12:28 PM
Último mensaje: papi
  [TUTORIAL] Como evitar el Hotlinkeo (robo de imágenes) Taquion 8 1,690 12-01-2013, 05:50 PM
Último mensaje: natestale
  Tutorial | Crear Sistema de Login PHP diringax 13 1,741 18-12-2012, 01:49 AM
Último mensaje: BrayanFG
  [Tutorial] Dominios virtuales para localhost Alan71 25 2,208 18-12-2012, 01:44 AM
Último mensaje: BrayanFG



Usuarios navegando en este tema: 1 invitado(s)