2010-04-30 6 views
24

Soy un chico de VB.Net. (porque tengo que serlo, porque la persona que firma mi cheque lo dice): P) Crecí en Java y generalmente no tengo problemas para leer o escribir en C# cuando tengo la oportunidad. Encontré hoy una sintaxis que nunca había visto, y que parece que no puedo entender.En C#, ¿Qué es <T> después de una declaración de método?

En la siguiente declaración de método, ¿qué representa < T>?

static void Foo < T> (T params [] x)

que he visto se utiliza junto con declarar colecciones genéricas y las cosas, pero no puedo por la vida de a averiguar lo que hace por este método.

En caso de que importe, lo encontré pensando en C# brain teasers. El sexto avance contiene el fragmento de código completo.

Respuesta

20

Esto define un generic method, que es una forma de generics, que se agregaron a C# en C# 2.0.

El método debe ser sig:

static void Foo<T>(params T[] x) 
{ // ... 

Esto le permite pasar cualquier número de argumentos de cualquier (específico) escribir en el método de Foo, y actúa sobre esa matriz de argumentos. Es similar a la forma en que funcionan los tipos genéricos, excepto en el ámbito del método. El <T> especifica el tipo del argumento que se pasa en el método, por lo que se puede llamar a esto como:

Foo<MyClass>(myClassInstance, myClassInstance2, mySubclassInstance); 
+0

En concreto, se define el nombre (o nombres) utilizar para el tipo genérico (s) en el método. –

+1

Según tengo entendido, en este código, (params T [] x) es responsable de declarar que el método toma una cantidad de argumentos de tipo T y los almacena en una matriz a la que hace referencia x. Si eso es correcto, ¿qué agrega el < T > después del nombre del método a la declaración? – Drew

+0

Quizás permite que el que llama sea más prolijo al describir el tipo de las variables pasadas como parámetros. ¿Podría llamar a Foo con una línea que lea Foo (myClassInstance, myClassInstance2) siempre que myClassInstance y myClassInstance2 sean del mismo tipo? – Drew

1

Ese es el parámetro de tipo genérico de un método genérico.

Una vez que especifica un tipo para T al llamar al método, .NET puede garantizar la seguridad del tipo en función de ese parámetro de tipo.

static void Foo<T>(params T[] x) { } 

se llamaría como:

string[] names = new string[] {"Foo", "Bar", "Baz"}; 

Foo<string>(names); 

pero esto provocaría un error de compilación:

int[] nums = new int[] {1, 2, 3}; 

Foo<string>(nums); // nums is not string[] 
1

El T es un type parameter y en este caso puede ser cualquier cosa (una restricción puede ser especificado, pero aquí no hay restricción). Sin esta característica tendría que declarar el método para cada tipo que va a utilizar:

static void Foo(params int[] x)  
static void Foo(params string[] x)  
static void Foo(params Customer[] x)  
etc... 

Más información acerca de los genéricos se puede encontrar en MSDN: Introduction to Generics (C#).

+0

Aquí está la página de MSDN en los tipos genéricos http://msdn.microsoft.com/en-us/library/512aeb7t.aspx – Armstrongest

25

lo que está preguntando es el concepto de los genéricos en C#. Mediante el uso de medicamentos genéricos, puede utilizar este método para los tipos que desee

suponga que debe crear una función para agregar dos números. En ese caso, su función es

//For integer : 
public int sum(int a, int b) 
{ 
    return a + b; 
} 



//For floating point numbers : 
public float sum(float a, float b) 
{ 
    return a + b; 
} 

Siguiendo esta lógica, si desea una función que suma dos números de tipo doble, se crearía una función más, y así sucesivamente.

Bu con la ayuda de los genéricos puede reemplazar todas estas funciones y escribir lo siguiente,

public T sum<T>(T a, T b) 
{ 
    return a + b; 
} 

Esto funciona para todos los tipos numéricos, así como para las cadenas.

comprobar esto para más detalles: http://www.codeproject.com/kb/books/EssentialCS20.aspx

+3

+1 para el código Ejemplo de muestra y fácil de seguir! Muestra una comprensión clara de la Pregunta formulada y del nivel de comprensión del PO. – Armstrongest

+0

Buena respuesta con buenos ejemplos. – backslash17

+2

El ejemplo es fácil de entender, pero no funciona. No puede agregar dos variables de tipo genérico T. Consulte: http://stackoverflow.com/questions/32664/c-generic-constraint-for-only-integers La solución consiste en utilizar operadores genéricos de una biblioteca externa: http://www.yoda.arachsys.com/csharp/miscutil/usage/genericoperators.html –

Cuestiones relacionadas