¿Qué significa en C #

Soy nuevo en C # y me sumerjo directamente en la modificación de algunos códigos para un proyecto que recibí. Sin embargo, sigo viendo un código como este:

class SampleCollection 

y no puedo entender lo que

  

significa ni cómo se llama.

Si alguien quisiera ayudarme a nombrar cómo se llama este concepto, puedo buscarlo en línea. Sin embargo, estoy despistado a partir de ahora.

Es un parámetro de tipo genérico .

Un parámetro de tipo genérico le permite especificar un tipo arbitrario T a un método en tiempo de comstackción, sin especificar un tipo concreto en el método o statement de clase.

Por ejemplo:

 public T[] Reverse(T[] array) { var result = new T[array.Length]; int j=0; for(int i=array.Length; i>= 0; i--) { result[j] = array[i]; j++; } return result; } 

revierte los elementos en una matriz. El punto clave aquí es que los elementos de la matriz pueden ser de cualquier tipo, y la función seguirá funcionando. Usted especifica el tipo en la llamada al método; tipo de seguridad aún está garantizada.

Por lo tanto, para invertir una matriz de cadenas:

 string[] array = new string[] { "1", "2", "3", "4", "5" }; var result = reverse(array); 

Producirá una matriz de cadenas como result de { "5", "4", "3", "2", "1" }

Esto tiene el mismo efecto que si hubiera llamado a un método ordinario (no genérico) que se parece a esto:

 public string[] Reverse(string[] array) { var result = new string[array.Length]; int j=0; for(int i=array.Length; i >= 0; i--) { result[j] = array[i]; j++; } return result; } 

El comstackdor ve que la array contiene cadenas, por lo que devuelve una matriz de cadenas. La string tipo se sustituye por el parámetro de tipo T


Los parámetros de tipo genérico también se pueden usar para crear clases genéricas. En el ejemplo que proporcionó de SampleCollection , el T es un marcador de posición para un tipo arbitrario; significa que SampleCollection puede representar una colección de objetos, cuyo tipo especifique al crear la colección.

Asi que:

 var collection = new SampleCollection(); 

crea una colección que puede contener cadenas. El método Reverse ilustrado arriba, en una forma algo diferente, se puede usar para invertir los miembros de la colección.

Es un parámetro de tipo genérico, consulte la documentación de Generics .

T no es una palabra clave reservada. T , o cualquier nombre de stack , significa un parámetro de tipo. Verifique el siguiente método (solo como un ejemplo simple).

 T GetDefault() { return default(T); } 

Tenga en cuenta que el tipo de devolución es T Con este método puede obtener el valor predeterminado de cualquier tipo llamando al método como:

 GetDefault(); // 0 GetDefault(); // null GetDefault(); // 01/01/0001 00:00:00 GetDefault(); // 00:00:00 

.NET usa generics en colecciones, … ejemplo:

 List integerList = new List(); 

De esta manera tendrá una lista que solo acepta números enteros, porque la clase se instancita con el tipo T , en este caso int , y el método que agrega elementos se escribe como:

 public class List : ... { public void Add(T item); } 

Algo más de información sobre generics.

Puede limitar el scope del tipo T

El siguiente ejemplo solo le permite invocar el método con tipos que son clases:

 void Foo(T item) where T: class { } 

El siguiente ejemplo solo le permite invocar el método con tipos que son Circle o heredar de él.

 void Foo(T item) where T: Circle { } 

Y hay new() que dice que puedes crear una instancia de T si tiene un constructor sin parámetros. En el siguiente ejemplo, T se tratará como Circle , obtendrás intellisense …

 void Foo(T item) where T: Circle, new() { T newCircle = new T(); } 

Como T es un parámetro de tipo, puede obtener el objeto Type partir de él. Con Type puedes usar reflection …

 void Foo(T item) where T: class { Type type = typeof(T); } 

Como un ejemplo más complejo, verifique la firma de ToDictionary o cualquier otro método de Linq.

 public static Dictionary ToDictionary(this IEnumerable source, Func keySelector); 

No hay una T , sin embargo, hay TKey y TSource . Se recomienda que siempre nombre los parámetros de tipo con el prefijo T como se muestra arriba.

Puede nombrar TSomethingFoo si lo desea.

Esta característica se conoce como generics. http://msdn.microsoft.com/en-us/library/512aeb7t(v=vs.100).aspx

Un ejemplo de esto es hacer una colección de artículos de un tipo específico.

 class MyArray { T[] array = new T[10]; public T GetItem(int index) { return array[index]; } } 

En tu código, podrías hacer algo como esto:

 MyArray = new MyArray(); 

En este caso, T[] array funcionaría como int[] array , y public T GetItem funcionaría como public int GetItem .