Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad I: Repaso. 5
Definificiones. 5
Modificadores de Acceso. 6
Referencia .this. 6
Garbage Collector y Finalizers (Destructors). 7
Miembros estáticos. 7
Composición y Agregación. 8
Cardinalidad. 8
Colección ArrayList. 9
Bibliografía. 11
Unidad V: String. 26
Definiciones. 26
Clase String. 27
Clase StringBuilder. 32
Búsquedas en un Objeto StringBuilder. 34
Struct Char. 35
Clase Regex. 37
Bibliografía. 37
Definificiones.
Clase: una clase o struct es como un plano o molde que especifica lo que el tipo puede hacer. Un
tipo definido como una clase es un tipo “referencia”. En tiempo de ejecución una variable de tipo
referencia contiene el valor null hasta que explícitamente se cree una instancia de la clase
empleando el operador new o se asigne un objeto de tipo compatible que haya sido creado
previamente.
Objeto: instancia de una clase. Bloque de memoria que ha sido alocada y configurada acorde a
su clase. Un programa puede crear varios objetos de la misma clase, estos pueden ser
almacenados en una variable de referencia o en un arreglo o colección.
Método: bloque de código que contiene una serie de sentencias. un programa causa que estas
sentencias sean ejecutadas al llamar al método especificando los argumentos requeridos por el
mismo. Los métodos son declarados en una clase o struct especificado el valor de retorno, el
nombre del método, los parámetros del método, el nivel de acceso:
● public
● private
● protected
y modificadores opcionales tales como:
● abstract
● sealed
La forma en la que se declara un método se denomina firma. El valor de retorno de un método
no es parte de la firma para permitir la sobrecarga; sin embargo, es parte de la firma al
determinar la compatibilidad entre un delegado y el método al cual apunta.
Los parámetros de los métodos se encuentran entre los paréntesis y se encuentran separados por
comas. Paréntesis vacíos indican que el método no requiere parámetros.
Constructor: es un método cuyo nombre es el mismo que el nombre de su tipo. Su firma incluye
solo el nombre del método y su lista de parámetros; no incluye un valor de retorno. Este método
es llamado cuando una clase o struct es creado. Una clase o struct puede tener múltiples
constructores que tomen diferentes argumentos (deben variar en cantidad, tipo u orden para que
puedan ser distinguidos en tiempo de ejecución). Los constructores permiten setear los valores
por defecto (estado inicial del objeto), limitar la instanciación y escribir código que sea flexible y
fácil de leer. Si no se especifica un constructor, C# genera uno por defecto (implícito) que
instancia el objeto y setea sus variables miembros a los valores por defecto preestablecidos del
lenguaje (ver Tabla de valores por defecto)
Modificadores de Acceso.
permiten especificar los niveles de accesibilidad declarada para miembros (clases, propiedades,
métodos).
● public: el acceso no se encuentra restringido.
● private: el acceso se encuentra limitado al tipo que lo contiene.
● protected: el acceso se encuentra limitado a la clase contenedora o a tipos derivados de
dicha clase contenedora.
● internal: el acceso se encuentra limitado al ensamblado actual.
● protected internal: el acceso está limitado al ensamblado actual o al los tipos derivados
de la clase contenedora.
● private protected: el acceso está limitado a la clase contenedora o a los tipos derivados
de la clase contenedora que hay en el ensamblado actual (a partir de versión 7.2)
Solo se permite un modificador de acceso para un miembro o tipo, excepto cuando se usan las
combinaciones protected internal o private protected. No se permiten modificadores de acceso en
espacios de nombres, dado que los espacios de nombre no tienen restricciones de acceso. Los
modificadores de acceso no se permiten en espacios de nombre (namespaces) ya que estos no
tienen restricciones de acceso.
Referencia .this.
La palabra reservada this refiere a la instancia actual de la clase y es también usada como un
modificador del primer parámetro de un método de extensión.Sus usos mas comunes son:
● Para calificar a miembros ocultos por nombres similares
CalcTax(this);
Un problema con el GC es que no garantiza que realizará la tarea en un tiempo especificado. Por
tanto, el GC puede llamar al destructor del objeto en cualquier momento luego de que este se
haya vuelto elegible para la destrucción y reclamar su memoria en cualquier momento posterior a
la ejecución del finalizador. No es claro cuando el destructor será llamado y por esta razón los
destructores son raramente empleados.
Miembros estáticos.
Una clase no estática puede contener métodos, campos, propiedades o eventos estáticos. El
miembro estático puede ser llamado en una clase o incluso cuando ninguna instancia de la clase
ha sido creada. El miembro estático siempre se accede empleando el nombre de la clase y no el
de la instancia. Solo una copia del miembro estático existe y es compartida por todas las
instancias de la clase. Métodos y propiedades estáticos no pueden acceder a campos no estáticos
o eventos en su tipo contenedor, y no pueden acceder a una variable de instancia de cualquier
objeto a menos que sean explícitamente pasados como parámetro de un método.
Dos usos comunes de campos o atributos estáticos son llevar la cuenta del número de objetos
instanciados o almacenar algún valor que deba compartirse por todas las instancias.
Los métodos estáticos pueden sobrecargarse pero no sobreescribirse, dado que pertenecen a la
clase y no a alguna de las instancias de dicha clase.
C# no soporta variables locales estáticas.
Los miembros estáticos se declaran empleando la palabra reservada static.
Composición y Agregación.
● Composición (Def.): Representa una relación “tiene un”, en donde el ciclo de vida del
todo y las partes se encuentra ligados. Solo una clase puede representar el todo y las
partes pueden pertenecer a un solo “todo” al mismo tiempo.
En este modelo en particular se considera que la creación de las partes se realiza desde el
constructor del todo.
Representación UML.
Se representa con una línea con un rombo relleno en uno de sus extremos, el cual indica
la clase que representa el todo.
● Agregación (Def.): Representa una relación “tiene un”, en forma débil. El ciclo de vida de
las partes y el todo no se encuentra ligados, por tanto las partes pueden existir sin un todo
y el todo sin las partes. El todo no es responsable de la creación y destrucción de las
partes. Una parte puede pertenecer a más de un todo al mismo tiempo. Las partes se
asocian al todo a través de variables de instancia.
Representación UML.
Se representa con una línea con un rombo vacío en uno de sus extremos, el cual indica la
clase que representa el todo.
Cardinalidad.
La cantidad de objetos que se crearán de cada clase en ambas relaciones está dada por la
cardinalidad, la cual se indica en cada extremo de la relación correspondiente a cada clase en el
diagrama UML. La implementación de algunas de esas cardinalidades requiere el empleo de
algunas estructuras de datos (tales como arreglos) que se incluyen en las clases.
Colección ArrayList.
Estructura dinámica de datos que puede aumentar o disminuir la cantidad de memoria requerida
para almacenar datos en respuesta a cambios en los requerimientos de una aplicación durante el
tiempo de ejecución. Pertenece a las colecciones no genéricas, por tanto almacena referencias a
objetos de tipo object y deben realizarse conversiones (casteos) para trabajar con propiedades o
métodos específicos de cada tipo de objeto que se almacene. Pueden almacenarse objetos de
cualquier tipo, ya que todos derivan de la clase Object.
Clase ArrayList: pertenece al namespace System.Collections y representa un arreglo dinámico
cuyo tamaño puede modificarse a través de los métodos de la clase. Implementa la interfaz IList.
Propiedad Descripción
Método Descripción
Por defecto, un objeto de esta clase puede almacenar tantos elementos como el valor indicado en
la propiedad Capacity. Cuando esta capacidad inicial se supera, automáticamente se alojan los
recursos necesarios para duplicar la capacidad anterior. En general, el proceso de agregar
elementos es lento cuando es necesario asignar memoria (se supera la capacidad), pero es rápido
cuando la capacidad es suficiente.
Es posible ajustar el valor de la propiedad Capacity a la cantidad de objetos actualmente
contenidos en el arreglo mediante el método TrimToSize() para optimizar el uso de memoria, sin
embargo, si luego se deseara adicionar nuevos elementos, el proceso se volverá lento dado que
la ArrayList debe crecer dinámicamente.
Los métodos IndexOf(), Contains() y Remove() realizan una búsqueda lineal para cumplir sus
funciones, una operación costosa cuando el vector es grande. Si la ArrayList está ordenada se
puede emplear el método BinarySearch(Array, Object) para realizar una búsqueda más eficiente
en el caso de los dos primeros métodos antes mencionados, este devuelve el índice del elemento
especificado si este se encuentra en el arreglo o un número negativo si este no se encuentra.
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/cla
sses
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/obj
ects
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/met
hods
● https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/accessibility-l
evels
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/con
structors
● https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/this
● https://docs.microsoft.com/en-us/dotnet/api/system.gc?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/des
tructors
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/stat
ic-classes-and-static-class-members
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.arraylist?view=netframework
-4.7.2
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 4, 10 and 21
p. 821-825.
Miembros Protegidos.
Los miembros privados de una clase base son heredados a sus clases derivadas pero no son
directamente accesibles para los métodos y propiedades de la clase derivada. Empleando el
modificador de acceso protected se obtiene un nivel de acceso intermedio entre public y private,
haciendo que los miembros de la clase base protegidos puedan ser accedidos directamente solo
por los miembros de esa clase base y por todos los miembros de las clases derivadas.
Todos los miembros no privados mantienen su modificador de acceso original cuando se
convierten en miembros de la clase derivada. Los métodos de las clases derivadas pueden
referirse a miembros públicos o protegidos heredados de la clase base simplemente usando el
nombre de los miembros. Cuando se sobreescribe un método de la clase base, la versión del
método en la clase base puede accederse empleando base. (palabra reservada base seguida del
operador de acceso a miembros “.”) seguido del nombre del método.
Constructores.
El constructor de la clase derivada llama de manera explícita o implícita al constructor de la clase
base para asegurar que las variables de instancia heredadas de la clase base sean inicializadas
apropiadamente:
● Explícita: empleando el inicializador del constructor con la palabra reservada base
seguida de los parámetros que posea el constructor de la clase base (deben coincidir el
número y el tipo de parámetros).
● Implícita: Sin invocarlo, directamente se crea la instancia del objeto de la clase derivada
empleando el constructor predeterminado sin parámetros de la clase base, si este lo tiene.
La llamada es realizada por el compilador. Incluso si una clase no tiene constructor, el
constructor por defecto que el compilador implícitamente declarará para la clase llamará al
constructor por defecto de la clase base. La clase Object es la única clase que no tiene
clase base.
Si la clase base es derivada de otra, esta llamará al constructor de su clase base directa para
la creación de dicha instancia. Esta cadena de llamadas de constructores finaliza en la creación
de una instancia de Object de la cual derivan todas las clases de C#. Cada constructor antes de
realizar sus tareas invoca al constructor de su clase base directa, de esta manera el constructor
de la clase derivada es el último en ejecutarse de la cadena.
Clase Object.
Todas las clases heredan directa o indirectamente de esta clase. Sus 7 métodos son heredados
por todas las clases.
Método Descripción
Representación UML.
La herencia se representa con una línea conteniendo una flecha vacía en uno de sus extremos,
que indica cuál es la clase base. El extremo que no tiene la flecha señala la clase derivada. Puede
haber múltiples clases derivadas, pero solo una clase base (una clase no puede heredar de dos
clases bases al mismo tiempo).
El modificador de acceso protected se representa en antecediendo a los miembros de la clase
base con el símbolo #.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EjemploHerencia
{
//Implementación de una interfaz en la clase base. Clase
Abstracta
public abstract class Prisma:IComparable
{
private double altura;
namespace EjemploHerencia
{
//Implementación de Herencia en clase concreta.
class Circulo:Prisma
{
private double radio;
Bibliografía.
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 11.
Polimorfismo.
Considerado el tercer pilar de la Programación Orientada a Objetos, junto con la Herencia y la
Encapsulación. Posee dos aspectos distintivos:
● En tiempo de ejecución, los objetos de una clase derivada pueden ser tratados como
objetos de una clase base como parámetros de métodos y colecciones o arreglos. Cuando
esto ocurre, el tipo del objeto declarado no es idéntico a su tipo durante la ejecución.
● Las clases bases pueden definir e implementar métodos virtuales y las clases derivadas
pueden sobreescribirlos, proveyendo su propia definición e implementación. En tiempo de
ejecución, cuando el código del cliente llama al método, el CLR busca el tipo del objeto en
ejecución, e invoca el método sobreescrito. Por tanto, en el código fuente puede llamarse a
un método de la clase base y producir la ejecución de la versión del método de la clase
derivada.
Implementación en código.
Implica el uso de referencias de la clase base para la instanciación de objetos de la clase
derivada. Al momento de instanciar se emplea el constructor de la clase derivada en la referencia
del objeto de la clase base, de modo tal que este sea tratado como un objeto de la clase base y
todos los objetos sean procesados conjuntamente de forma común. Si se requiere emplear algún
método específico de la clase derivada se emplea downcasting.
public Form1()
{
InitializeComponent();
rbtnCirculo.Checked = false;
rbtnRectangulo.Checked = false;
}
}
else
{
MessageBox.Show("Complete los campos
correspondientes");
}
}
Se pueden implementar varias interfaces, listandolas seguidas de la clase separadas por comas.
Si dicha clase hereda de otra, las interfaces a implementar se listan luego de de esta separadas
por una coma.
El usuario puede generar sus propias interfaces declarando su nombre antecedido por la letra “I”.
Los métodos dicha interfaz deben ser declarados eligiendo un nombre que represente de forma
general su aplicación.
Representación UML.
La interfaz se distingue de una clase mediante el uso del decorador <<interface>> sobre el
nombre de la misma. La relación entre la clase y la interface es la de realización o
compresión (realization); una clase comprende o implementa una interface. En el modelo esto
es indicado por una línea punteada con una flecha hueca que apunta a la clase que implementa la
interface.
Interface Descripción
Clases abstractas.
Son clases de las cuales nunca se desea instanciar un objeto o que carecen de implementación,
ya que se encuentran “incompletas”, y son empleadas como clases base en jerarquías de
herencia. Su propósito es proveer de una clase base apropiada de las que otras clases puedan
heredar y por tanto compartir un diseño común.
Las clases abstractas tienen las siguientes características:
● No pueden ser instanciadas.
● Pueden contener accesores o métodos abstractos.
● No es posible modificar una clase abstracta ( modificador abstract) con el modificador
sealed ya que ambos modificadores tienen un significado opuesto: el modificador sealed
impide que la clase pueda ser heredada mientras que el modificador abstract requiere que
la clase sea heredada.
● Una clase no abstracta (concreta) derivada de una clase abstracta debe contener
implementaciones de todos los métodos y accesores abstractos heredados.
Las propiedades abstractas se comportan como los métodos excepto por la diferencia en la
sintaxis de declaración e invocación. Es un error usar el modificador abstract en una propiedad
estática. Una propiedad abstracta heredada puede ser sobreescrita incluyendo una declaración de
la propiedad que use el modificador override.
Una clase declarada sealed no puede ser una clase base. Todos los métodos de una clase
sealed son implícitamente sealed. Ej: Clase String.
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/pol
ymorphism
● https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/abstract
● https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/sealed
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 12.
Unidad IV: Manejo de excepciones.
Definiciones.
Excepción: Indicador de que un problema ha ocurrido durante la ejecución de un programa.
Suelen ser infrecuentes.
El manejo de excepciones permite crear programas que controlen las excepciones, permitiendo
● Que el programa continúe la ejecución.
● Notificar al usuario del problema antes de terminar la ejecución de forma controlada, en
casos en los que esta no pueda continuar su ejecución normal.
● Garantizar que recursos empleados por un programa sean liberados posteriormente,
incluso ante la ocurrencia de una excepción (bloque finally).
Cuando ocurre una excepción, el IDE muestra un cuadro de diálogo conteniendo la Stack Trace
(rastro de pila-de llamadas-): incluye el nombre de la clase a la que pertenece la excepción, en un
mensaje indicando el problema que ocurrió y el camino que lleva a la excepción, método a
método.
Ejemplo:
● Excepción: DivideByZeroException.
Unhandled Exception:System.DivideByZeroException:
Attempted to divide by zero.
at DivideByZeroExceptionHandling.Main()
in C:\examples\ch13\Fig13_01\DivideByZeroNoExceptionHandling\
DivideByZeroNoExceptionHandling\
DivideByZeroNoExceptionHandling.cs:line 18
En el mensaje de error se puede observar el nombre de la clase de la excepción
(System.DivideByZeroException) seguido de un texto que indica porque la misma tuvo lugar. En
la stack trace (Ver detalles), cada “at” indica una línea de código en el método en particular que
se estaba ejecutando cuando ocurrió la excepción, la dirección y el nombre del archivo
conteniendo el código y el número de línea en donde ocurrió la excepción. El primer “at” en la
línea de la stack trace indica el throw point de la excepción- el punto inicial al cual la excepción
ocurrió.
Manejo de Excepciones.
Se emplea la sentencia try, la cual consiste en un bloque try, uno o mas bloques catch y,
ocasionalmente, un bloque finally. El código que puede producir la excepción se coloca en el
bloque try mientras que el código para el manejo de excepciones se encuentra en el bloque
catch. Un bloque catch especifica un parámetro de excepción que representa la excepción que
dicho bloque puede manejar. Este puede usar el identificador del parámetro para interactuar con
un objeto de excepción que haya “atrapado”. Si no hay necesidad de emplear un objeto excepción
en el bloque catch este puede ser omitido. Opcionalmente, se puede incluir un bloque catch que
no especifique un tipo de excepción (conocido como catch general) que maneje todos los tipos
de excepciones; este debe encontrarse siempre como último bloque catch, de usarse. Si el
bloque try termina debido a una excepción, el CLR busca el primer bloque catch cuyo tipo en su
parámetro coincida con el tipo de la excepción y lo ejecuta obviando el resto de los bloques catch.
Una coincidencia se da si el tipo del parámetro y el de la excepción coinciden o si el tipo de la
excepción es de una clase derivada de la del parámetro del bloque antes mencionado.
Luego de que cualquiera de los bloques catch termine, el programa continúa con la siguiente
sentencia que se encuentre luego del último bloque catch.
Al menos un bloque catch o finally debe seguir al bloque try. Adicionalmente, cuando el bloque try
finaliza, las variables locales definidas en dicho bloque pierden alcance por lo que no podrán ser
accedidas en otros bloques (tales como el bloque finally).
El bloque finally se emplea para código asociado a la liberación de recursos por parte del
programa o archivos que se estén empleando en él, ya que este se ejecuta independientemente
de si el bloque try logró ejecutarse (se ejecuta inmediatamente despues) o su ejecución se vio
interrumpida por una excepción (se ejecuta luego del bloque catch). Si una excepción no es
manejada por un bloque catch o si un bloque catch asociado al try lanza una excepción, este
bloque se ejecuta antes de que la excepción sea procesada por el siguiente bloque try. El bloque
finally es opcional.
Una excepción no manejada es aquella para la cual no hay un bloque catch coincidente.
Ejemplo:
using System;
class ExceptionTestClass
{
public static void Main()
{
int x = 0;
try
{
int y = 100/x;
}
catch (ArithmeticException e)
{
Console.WriteLine("ArithmeticException Handler: {0}",
e.ToString());
}
catch (Exception e)
{
Console.WriteLine("Generic Exception Handler: {0}",
e.ToString());
}
}
}
/*
This code example produces the following results:
*/
● SystemException: representa las excepciones que tienen que ver con el entorno de
ejecución. En general, son excepciones graves de las que no se puede volver (invocar un
método de una variable de referencia que no referencia a un objeto, invocar a un método
recursivo que llena la pila).
Cuando se crea código que tira excepciones, este debe estar bien documentado para que otros
desarrolladores que usen el código puedan saber cómo manejarlas.
Creación excepciones.
Las excepciones se crean empleando la palabra reservada throw seguida de new; las
excepciones pueden ser generadas por el CLR, el Framework .NET, cualquier librería de terceros
o por código en la aplicación . La ejecución de la sentencia throw indica que un problema ha
ocurrido en el código y específica un objeto a ser lanzado. El operando de la sentencia throw
puede ser de tipo Exception o de cualquiera de sus clases derivadas. El string pasado en el
constructor se convierte en el mensaje de error del objeto de tipo Exception.
Ejemplo:
class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new System.DivideByZeroException();
return x / y;
}
static void Main()
{
// Input for test purposes. Change the values to see
// exception handling behavior.
double a = 98, b = 0;
double result = 0;
ry
t
{
result = SafeDivision(a, b);
Console.WriteLine("{0} divided by {1} = {2}", a, b, result);
}
catch (DivideByZeroException e)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
Las excepciones pueden ser re-lanzadas dentro del primer bloque catch que las atrape. Esto
indica que dicho bloque catch hizo un procesamiento parcial de la excepción y ahora la arroja
nuevamente para continuar su procesamiento. En general, se considera una mejor práctica el
lanzar una nueva excepción y pasar la original como argumento en el constructor de la nueva
excepción, la cual será el valor de la propiedad InnerException (ver ejemplo en la descripción
de la propiedad). Esto mantiene toda la información de la Stack Trace de la excepción original
que se perdería de lanzar nuevamente la misma excepción.
Excepciones Comunes.
Excepción Descripción
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/api/system.exception?view=netframework-4.7.2#de
finition
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/exceptions/
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 13.
Unidad V: String.
Definiciones.
Constantes de caracteres: es un carácter que se encuentra representado por un valor entero
denominado código de carácter (character code). Estas constantes se encuentran establecidas de
acuerdo con el set de caracteres Unicode, el cual contiene mayor cantidad de símbolos y letras
que el ASCII. Ej: el valor entero ‘122’ corresponde a la constante de caracter ‘z’.
String: es una serie de caracteres tratados como una unidad. Estos pueden ser letras
mayúsculas, letras minúsculas, dígitos y varios caracteres especiales tales como +, -, *, /, $, etc.
Un string es un objeto de la clase String en el namespace System. Los literales de strings,
denominados constantes de string se escriben como una secuencia de caracteres entre comillas.
Ejemplo:
● “ John Q. Doe”
● “9999 Main Street”
● “(201) 555-1212”
Una declaración puede asignar un literal a una referencia de string:
string color = “blue”;
inicializa la variable color de tipo string para que refiera al objeto string literal “blue”.
String Verbatim: en cadenas de texto con múltiples separadores ‘\’, tales como las direcciones de
archivos, se puede emplear una secuencia de escape que interprete todos los caracteres de un
string como literales “@”, para evitar el excesivo uso de estos. esto permite generar un string
verbatim, en donde ciertos caracteres no sean considerados secuencias de escape. Esta
aproximación tiene la ventaja adicional de permitir a los literales de string ocupar múltiples líneas
preservando todas las líneas nuevas, espacios y tabs.
Ejemplo:
● Sin Verbatim:
string file = “C:\\MyFolder\\MySubFolder\\MyFile.txt”;
● Con Verbatim:
string file = @“C:\MyFolder\MySubFolder\MyFile.txt”;
Clase String.
Clase sealed que representa texto como una secuencia de unidades de código UTF-16.
Un string es una colección secuencial de caracteres que son empleados para representar
texto. Un objeto String es una colección secuencial de objetos System.Char que representa
un string; un objeto System.Char corresponde a una unidad de código UTF-16. El valor de
dicho objeto string es el contenido de la colección secuencial de objetos System.Char y su valor
es inmutable.
Instanciación.
1. Por asignación de un literal a una variable de tipo string.
2. Empleando constructores de la clase.
Constructor Descripción
3. Empleando concatenación de strings mediante el operador ‘+’ para generar un nuevo string
que contenga dichas instancias o literales de strings.
4. Llamando a un método de conversión o formateo que transforme un valor u objeto a su
representación en string.
Propiedades.
Propiedad Descripción
Métodos.
Clase StringBuilder.
Clase sealed que representa una cadena de caracteres mutable. Se emplea cuando se desea
realizar manipulaciones extensivas o repetitivas de strings (número grande o indefinido); no puede
emplearse en casos de búsqueda ya que dicha clase carece de los métodos de búsqueda que
posee la clase String. Un objeto de esta clase mantiene un buffer para alojar expansiones del
string si hay espacio disponible (capacidad), si no lo hay, la capacidad se expande para alojar a
los caracteres adicionales (el contenido del buffer anterior se copia en el nuevo buffer).
Instanciación.
Constructor Descripción
Propiedades.
Propiedad Descripción
Métodos.
Método Descripción
Buscar los valores de string Útil para determinar si un No puede ser empleado
antes de agregarlos a un substring existe. cuando el índice de un
objeto StringBuilder. substring es importante.
Llamar al método ToString() y Fácil de usar si se asigna todo Engorroso llamar al método
buscar en el objeto String el texto a un objeto ToString() si deben realizarse
retornado por dicho método. StringBuilder y luego se lo modificaciones antes de que
modifica. todo el texto sea agregado al
objeto StringBuilder. Debe
recordarse trabajar desde el
final del texto de dicho objeto
si se realizan cambios.
Struct Char.
Representa un carácter como una unidad de código UTF-16.
Operaciones comunes.
Convertir un objeto Char o un par de objetos Para un único carácter se puede emplear
Char sustitutos en un punto de código Convert.ToInt32(Char), para un par suplente o
un caracter dentro de un string se emplea
Char.ConvertToUtf32()
Clase Regex.
Representa una expresión regular inmutable. Pertenece al namespace
System.Text.RegularExpressions.
Las expresiones regulares son un formato especial de objetos string que se utilizan para buscar
patrones en texto. Pueden ser útiles durante la validación de información ya que permiten verificar
condiciones a cumplir, representado las mismas de forma sencilla. Las expresiones regulares
utilizan “clases de caracteres” que no son comparables a las clases ya conocidas, son sólo
secuencias de escapes que representan un conjunto de caracteres que podrían aparecer en un
string.
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/api/system.string?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.text.stringbuilder?view=netframework-4.
7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.char?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex?view=net
framework-4.7.2
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 16.
Unidad VI: Archivos.
Para lograr la persistencia de grandes cantidades de datos incluso luego que el programa que los
creo haya terminado se emplean Archivos. Los datos mantenidos en archivos se denominan
persistentes. Los archivos son alojados en dispositivos de almacenamiento secundario (discos
magnéticos, discos ópticos, memoria flash,etc).
Jerarquía de datos.
1. Bits (binary digit): elemento más pequeño de dato que puede soportar una computadora;
puede asumir dos valores: 0 ó 1. Los circuitos en las computadoras realizan varias
manipulaciones sencillas de bits tales como examinar el valor de un bit, establecer el valor
de un bit o revertir dicho valor.
2. Caracteres: incluyen dígitos decimales, letras y símbolos especiales. El set de caracteres
empleados para escribir programas y representar ítems de datos en una computadora en
particular se denomina set de caracteres de dicha computadora. Cada carácter del set se
encuentra representado como un patrón de 0s y 1s, para permitir a la máquina su
manipulación y procesamiento. Un byte está compuesto por 8 bits. C# emplea el set de
caracteres Unicode.
3. Campos: Consisten en grupos de caracteres que conllevan un significado. Ej: El nombre
de una persona, un número de teléfono o documento, etc.
4. Registros: Se componen de varios campos relacionados y se pueden representar como
una clase. Ej: Registro de un empleado consistente en nombre, apellido, número de
identificación, cargo, etc.
5. Archivos: Grupo de registros relacionados. Ej: registros de todos los empleados de una
empresa.
6. Bases de Datos: permiten el almacenamiento de datos relacionados. La creación y el
manejo de las mismas se realiza a través de una colección de programas denominados
Sistemas de manejo de bases de datos (DBMS).
Los registros pueden organizarse dentro de un archivo mediante el uso de una key (llave) elegida,
que identifica al registro de forma distintiva respecto de los demás (unívocamente). Una de las
formas de organización se denomina secuencial, en la que los registros son almacenados en
orden según su campo key. Este tipo de archivo se denomina secuencial.
● Console.Out: refiere a standard output stream object, que permite a programas mostrar
datos en pantalla. Es de tipo TextWriter (Clase). Usado en los métodos Write() y
WriteLine().
● Console.In: refiere a standard input stream object, que permite a programas ingresar
datos desde dispositivos de entrada tales como el teclado. Es de tipo TextReader (Clase).
Usado en los métodos Read() y R eadLine().
● Console.Error: refiere a standard error stream object, que permite a programas mostrar
mensajes de error en la pantalla.
Estos objetos emplean flujos para facilitar la comunicación entre un programa y un archivo o
dispositivo particular. Hay varias clases para el procesamiento de archivos en la librería de clases
del Framework. El espacio de nombre System.IO incluye las clases StreamReader,
StreamWriter y FileStream.
Clase File.
Provee métodos estáticos para la creación, copia, eliminación, movimiento y apertura de un solo
archivo, y auxilia en la creación de objetos de tipo FileStream. Se puede emplear esta clase para
obtener o establecer los atributos o la información relacionada con la creación, acceso y escritura
de un archivo.
Muchos de los métodos de la clase devuelven otros objetos de tipo I/O cuando se crean o abren
archivos. Por defecto, acceso completo a lectura y escritura de archivos nuevos es brindada a
todos los usuarios.
Enumeraciones.
Las enumeraciones empleadas para especificar el comportamientos de varios métodos de la clase
son:
Enumeración Descripción Campos
ReadWrite: Permite la
subsecuente apertura del
archivo para lectura y
escritura. Pueden requerirse
permisos adicionales para
acceder a la lectura y
escritura de un archivo.
Métodos.
Método Descripción
using System;
using System.IO;
class Test
{
public static void Main()
{
string path = @"c:\temp\MyTest.txt";
if (!File.Exists(path))
{
// Create a file to write to.
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
Métodos.
Método Descripción
using System;
using System.IO;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string sourceDirectory = @"C:\current";
string archiveDirectory = @"C:\archive";
try
{
var txtFiles = Directory.EnumerateFiles(sourceDirectory,
"*.txt");
oreach (string currentFile in txtFiles)
f
{
string fileName =
currentFile.Substring(sourceDirectory.Length + 1);
Directory.Move(currentFile,
Path.Combine(archiveDirectory, fileName));
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
using System;
using System.IO;
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
string sourceDirectory = @"C:\source";
string destinationDirectory = @"C:\destination";
try
{
Directory.Move(sourceDirectory, destinationDirectory);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
Clase FileStream.
Provee de un flujo para un archivo, permitiendo operaciones de lectura/escritura tanto sincrónicas
como asincrónicas. Se emplea para leer desde, escribir en, abrir y cerrar archivos en un sistema
de archivos.
Constructores.
Nota: Se especifican los constructores de interés para el curso.
Constructor Descripción
Propiedades.
Nota: se describen algunas propiedades seleccionadas.
Propiedad Descripción
using System;
using System.IO;
class FStream
{
static void Main()
{
const string fileName = "Test#@@#.dat";
using(FileStream
fileStream = new FileStream(fileName, FileMode.Create))
{
// Write the data to the file, byte by byte.
for(int i = 0; i < dataArray.Length; i++)
{
fileStream.WriteByte(dataArray[i]);
}
--------------------------------------------------------------------------
using System;
using System.IO;
class FStream
{
tatic void Main()
s
{
const string fileName = "Test#@@#.dat";
using(FileStream
fileStream = new FileStream(fileName, FileMode.Create))
{
// Write the data to the file, byte by byte.
for(int i = 0; i < dataArray.Length; i++)
{
fileStream.WriteByte(dataArray[i]);
}
Clase StreamReader.
Implementa un TextReader que lee caracteres de un flujo de bytes en una codificación particular.
Se emplea para leer información de un archivo de texto estándar. Por defecto, lee codificación
UTF-8 a menos que se especifique de otra forma mediante la propiedad CurrentEncoding.
Constructores.
Nota: se especifican algunos constructores seleccionados.
Constructor Descripción
Métodos.
Métodos Descripción
using System;
using System.IO;
class Test
{
public static void Main()
{
ry
t
{
// Create an instance of StreamReader to read from a file.
// The using statement also closes the StreamReader.
using (StreamReader sr = new StreamReader("TestFile.txt"))
{
string line;
// Read and display lines from the file until the end of
// the file is reached.
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (Exception e)
{
// Let the user know what went wrong.
Console.WriteLine("The file could not be read:");
Console.WriteLine(e.Message);
}
}
}
Clase StreamWriter.
Implementa un TextWriter para escribir caracteres en un flujo en una codificación particular. por
defecto, la clase emplea la codificación UTF-8 a menos que se especifique de otra forma.
Constructores.
Nota: se especifican algunos constructores seleccionados.
Constructor Descripción
StreamWriter(String, Boolean, Encoding) Inicializa una nueva instancia de la clase para la ruta
de archivo especificada empleando la codificación
especificada y el tamaño de buffer por defecto. Si el
archivo existe, puede ser sobreescrito o la
información puede ser adicionada. Si el archivo no
existe, el constructor crea uno nuevo.
Métodos.
Método Descripción
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace StreamReadWrite
{
class Program
{
static void Main(string[] args)
{
// Get the directories currently on the C drive.
DirectoryInfo[] cDirs = new
DirectoryInfo(@"c:\").GetDirectories();
}
}
Serialización.
Es el proceso de conversión de un objeto en un flujo de bytes para poder almacenarlo o
transmitirlo a memoria, a una base de datos o aun archivo. Su propósito principal es guardar el
estado de un objeto de modo tal de poder recrearlo cuando sea necesario. El proceso inverso se
denomina deserialización.
Proceso de Serialización.
El objeto es serializado a un flujo, el cual no solo lleva los datos, sino también la información sobre
el tipo del objeto tal como su versión, referencia cultural y sombre de ensamblado. A partir de esa
secuencia, el almacenamiento se puede realizar en una base de datos, en un archivo o en la
memoria.
Conversión de un objeto en serializable.
Para poder serializar un objeto, se debe marcar el mismo con el atributo [Serializable]; una
excepción es lanzada si se intenta serializar pero el tipo no contiene el atributo [Serializable]. Si
una clase serializada contiene referencias a objetos de otras clases y dichos objetos se
encuentran marcados con el atributo, los mismos serán también serializados.
Si no se desea serializar un campo particular dentro de la clase a ser serializada, se debe aplicar
el atributo [NonSerializable].
Serialización de un objeto.
Básica y binaria.
La serialización básica requiere que el objeto se encuentre marcado con el atributo [Serializable].
Es sencilla, pero no provee mucho control sobre el proceso.
La serialización binaria emplea codificación binaria para producir una serialización compacta para
usos tales como almacenamiento o flujos de redes basados en sockets. Se emplea la clase
BinaryFormatter (namespace System.Runtime.Serialization.Formatters.Binary), que permite
la escritura o lectura de objetos desde un flujo. Contiene el método Serialize() que escribe la
representación de un objeto a un archivo. El método Deserialize() de la misma clase lee esta
representación de un archivo y reconstruye el objeto original. Ambos métodos lanzan una
SerializationException si un error ocurre durante la serialización o deserialización. Ambos
métodos requieren un objeto de tipo Stream (FileStream) como parámetro para acceder al flujo
correcto.
Método Descripción
Personalizada.
Se puede especificar qué objetos serán serializados y como. La clase debe estar marcada con el
atributo [Serializable] e implementar la interfaz ISerializable. Si se desea que la deserialización
sea personalizada se emplea un constructor personalizado.
using System;
using System.IO;
using System.Collections;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
// Open the file containing the data that you want to deserialize.
FileStream fs = new FileStream("DataFile.dat", FileMode.Open);
try
{
BinaryFormatter formatter = new BinaryFormatter();
Propiedades Comunes.
Propiedad Descripción
Métodos Comunes.
Método Descripción
if(saveFileDialog1.ShowDialog() == DialogResult.OK)
{
if((myStream = saveFileDialog1.OpenFile()) != null)
{
// Code to write the stream goes here.
myStream.Close();
}
}
}
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/api/system.io.file?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.io.directory?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.io.streamreader?view=netframework-4.
7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.io.streamwriter?view=netframework-4.7.
2
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/serialization/
● https://docs.microsoft.com/es-mx/dotnet/api/system.runtime.serialization.formatters.binary.b
inaryformatter?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.nonserializedattribute?view=netframew
ork-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.openfiledialog?view=net
framework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.savefiledialog?view=netf
ramework-4.7.2
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 17.
Conversión Boxing/Unboxing.
Los tipos primitivos heredan de la clase ValueType en el espacio de nombre System. Dicha
clase, a su vez, hereda de la clase Object y hace que cualquier tipo primitivo puede ser asignado
a una variable Object; esto se denomina Conversión Boxing y permite que los tipos primitivos
puedan ser implementados como objetos. Esta conversión puede realizarse de forma explícita o
implícita.
Ejemplo:
int i = 5; // create an int value
object object1 = ( object ) i; // explicitly box the int value
object object2 = i; // implicitly box the int value
Una Conversión Unboxing puede ser usado para convertir explícitamente a una referencia object
en un valor de tipo primitivo.
Ejemplo:
int int1 = ( int ) object1; // explicitly unbox the int value
Si se intenta realizar unboxing de forma explícita a una referencia de objeto que no refiere al valor
tipo primitivo correcto causa una InvalidCastException.
Clases Autorreferenciales.
Contienen un miembro que referencia a un objeto del mismo tipo que la clase. Los objetos
autorreferenciales pueden unirse entre sí para formar estructuras de datos tales como listas,
colas, pilas y árboles, en donde un nodo apunta a uno o más nodos (link) en la estructura. Un link
null normalmente indica el final de la estructura de datos. La creación y el mantenimiento de
estructuras de datos dinámicas requiere alocación de memoria dinámica.
Ejemplo:
Se genera una clase base para formar una estructura de datos de tipo lista ligada (LinkedList). La
clase Node contiene una propiedad de tipo Node llamada Next que referencia al siguiente nodo
en la estructura de datos.
LinkedList.
Una LinkedList (lista enlazada) es una colección lineal (secuencia) de objetos de una clase
autorreferencial, llamados nodos, conectados por links de referencia. Un programa accede a la
LinkedList vía una referencia al primer nodo de la lista. Cada nodo subsecuente es accedido a
través de un miembro link de referencia alojado en el nodo previo.Por convención, el link de
referencia del último nodo de una lista es null para marcar el final de la estructura. Los datos son
almacenados en una lista enlazada de forma dinámica por lo que cada nodo se crea cuando es
necesario. Un nodo puede contener datos de cualquier tipo, incluyendo referencias a objetos de
otras clases.
Las listas enlazadas son apropiadas cuando el número de datos a ser representados en la
estructura de datos no es predecible. Las listas enlazadas solo se llenan cuando el sistema no
tiene suficiente memoria como para satisfacer las peticiones de alocación dinámica de la misma.
La lista puede mantenerse ordenada insertando los nodos en el punto apropiado de la colección
sin necesidad de mover elementos preexistentes.
Normalmente, los nodos no se guardan de forma contigua en memoria, sino que son lógicamente
continuos.
Implementación.
Clase ListNode
Contiene dos propiedades: Data, la cual puede referir a cualquier objeto, y Next que aloja una
referencia al siguiente objeto de tipo ListNode en la lista. Los constructores de esta clase
permiten inicializar el ListNode que será colocado al final de la lista o antes, respectivamente.
using System;
namespace LinkedListLibrary
{
// class to represent one node in a list
class ListNode
{
// automatic read-only property Data
public object Data {get; private set;}
using System;
namespace LinkedListLibrary
{
istNode firstNode;
private L
private L istNode lastNode;
private string name; // string like “list” to display
Console.WriteLine( "\n" );
} // end else
} // end method Display
/ end class List
} /
}
Clase EmptyListException.
Define una excepción para indicar operaciones no válidas en una lista vacía.
using System;
namespace LinkedListLibrary
{
// one-parameter constructor
public EmptyListException( string name )
: base( "The " + name + " is empty" )
{
// empty constructor
} // end EmptyListException constructor
// two-parameter constructor
public EmptyListException( string exception, Exception
inner )
: base( exception, inner )
{
// empty constructor
Stacks (Pilas).
Las pilas son estructuras lineales de tipo LIFO (Last-Input-First-Output). Las principales
operaciones para manipular pilas son push, que permite añadir un nuevo nodo en el principio de
la pila; y pop que permite remover un nodo del principio de la pila. El espacio de nombres
System.Collections contiene la clase Stack p ara implementar y manipular pilas que pueden
crecer o achicarse durante la ejecución de un programa.
Implementación.
Se puede implementar esta clase reutilizando la clase List mediante composición. Se emplea un
objeto privado de tipo List en la declaración de la clase y de esta forma se pueden esconder los
métodos de la clase List que no deban estar en la interfaz pública de la clase Stack; la clase
implementa los métodos de la pila delegando el trabajo al método de la clase List apropiado.
using LinkedListLibrary;
namespace StackCompositionLibrary
{
// class stack encapsulates List’s capabilities
public class Stack
{
private List stack;
Implementación.
Al igual que con Stack, se puede implementar esta clase reutilizando la clase List mediante
herencia. El método Enqueue llama a InsertAtBack; el método Dequeue llama a
RemoveFromFront.
Árboles.
Un árbol es una estructura de datos no lineal bidimensional. Los nodos de un árbol contienen
dos o más links.
Árboles Binarios.
En estos, cada nodo contiene dos links (de los cuales ninguno puede ser null). El nodo raíz es el
primer nodo del árbol. Cada link en la raíz refiere a un hijo. El hijo izquierdo es el primer nodo en
el subárbol izquierdo, y el hijo derecho es el primer nodo en el subárbol derecho. Los hijos de
un nodo específico se denominan parientes. Un nodo sin hijos se denomina nodo hoja (leaf
node).
Búsqueda en árboles de búsqueda binarios.
Un árbol de búsqueda binario (sin nodos duplicados) tiene la característica de que los valores en
el subárbol izquierdo son menores al valor en el subárbol del nodo padre; y los valores en
cualquier subárbol derecho son mayores que el valor en el subárbol del nodo padre. Los valores
de un árbol deben ser todos del mismo tipo.
Para insertar un nuevo nodo, se compara el valor de este con el del nodo padre, si este es menos
se ubica el nuevo nodo a la izquierda del nodo padre y si es mayor se lo ubica en la rama
derecha. Si el valor de nuevo nodo es igual al del nodo padre, dicho valor se descarta. Mediante
este algoritmo de inserción se facilita la eliminación de duplicados.
s rápida,
La búsqueda en un árbol binario por un valor que coincida con el valor key e
especialmente en árboles compactos, en donde cada nivel de dicha estructura contiene el doble
de elementos que el nivel anterior.
Nodos: 6 - 13 - 17 - 27 - 33 - 42 - 48.
Nodos: 6 - 17 - 13 - 33 - 48 - 42 - 27.
Para implementar búsquedas en árboles con valores de cualquier tipo en los nodos se puede
emplear la interfaz IComparable y su método CompareTo(). De esta forma se puede definir un
criterio que permita ubicar a los nodos en función del algoritmo de inserción preestablecido.
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/standard/collections/
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 19.
Todas las clases Collection en el Framework .NET implementan alguna combinación de las
interfaces de colecciones. Estas interfaces declaran las operaciones que pueden realizarse de
forma genérica sobre varios tipos de colecciones. Todas estas interfaces se declaran en el
espacio de nombres System.Collections y tienen análogos genéricos en el espacio de nombre
System.Collections.Generics; su implementación se provee dentro del framework.
Interfaz Descripción
Clase Array.
La clase base abstracta Array, de la cual todos los arreglos heredan implícitamente, provee todos
los métodos para la creación, manipulación, búsqueda, y ordenamiento de arreglos. Se considera
una colección porque implementa la interfaz IList. Tiene una capacidad fija (arreglo no dinámico).
Propiedades.
Propiedad Descripción
Métodos.
Método Descripción
Colecciones No Genéricas.
Referencian objetos de tipo Object y requieren downcasting para su posterior implementación en
aplicaciones.
Clase ArrayList.
Arreglo dinámico. Ver Unidad I: Repaso.
Clase Stack.
Representa una colección no genérica de objetos de tipo LIFO. La capacidad (número de
elementos que la pila puede contener) aumenta en función de la adición de nuevos elementos.
Las pilas aceptan null como un valor válido y permiten elementos duplicados. Su versión genérica
se encuentra implementada como un arreglo.
Propiedades.
Propiedad Descripción
Métodos.
Método Descripción
Clase Queue.
Representa una colección no genérica de objetos de tipo FIFO. La capacidad (número de
elementos que la cola puede contener) aumenta en función de la adición de nuevos elementos por
un factor de 2 y puede disminuirse llamando al método TrimToSize(). Las colas aceptan null como
un valor válido y permiten elementos duplicados. Se encuentra implementada como un arreglo
circular.
Propiedades.
Propiedad Descripción
Métodos.
Método Descripción
Métodos Genéricos.
Las declaraciones de todos los métodos genéricos tienen una lista de parámetros de tipo
(type-parameter list) delimitada por <>, que sigue al nombre del método. Cada lista de
parámetros de tipo contiene uno o mas parámetros de tipo, separado por comas (ej: <K,V>). Un
parámetro de tipo es un identificador que se usa en lugar del nombre de un tipo en particular.
Estos pueden ser empleados para declarar el tipo de retorno, los tipos de los parámetros y los
tipos de las variables locales en la declaración de un método genérico; el tipo de parámetro actúa
como referente para el tipo del argumento que representa el tipo de dato que será pasado al
método genérico.
Implementación.
Un método genérico puede sobrecargarse, pero cada uno de los métodos sobrecargados debe
tener una firma única Un método genérico puede ser sobrecargado por métodos no genéricos con
el mismo nombre.
Clases Genéricas.
Una clase genérica provee los medios para describir una clase independientemente del tipo de
parámetro. La declaración de una clase genérica es similar a la no genérica, excepto que el
nombre de la clase se encuentra seguido de una lista de parámetros de tipo (ej: <T>) y,
opcionalmente, una o mas limitaciones al tipo de parámetro.
Implementación.
Colecciones Genéricas.
Propiedades.
Propiedad Descripción
Métodos.
Método Descripción
AddAfter Agrega un nodo después de un nodo existente
especificado.
Clase List<T>.
Representa una lista de objetos que puede ser accedida por índice. Provee métodos de
búsqueda, ordenamiento y manipulación de listas.
Propiedades.
Propiedad Descripción
Métodos.
Método Descripción
Bibliografía.
● https://docs.microsoft.com/en-us/dotnet/standard/collections/
● https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
● https://docs.microsoft.com/en-us/dotnet/api/system.array?view=netframework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.stack?view=netframework-4.
7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.queue?view=netframework-
4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.linkedlist-1?view=net
framework-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.list-1?view=netframe
work-4.7.2
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.stack-1?view=netfra
mework-4.8
● https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1?view=netfr
amework-4.8
● Deitel & Deitel. “How to Program: Visual C# 2012. 5th Edition”. Chapter 20 and 21.