2012-09-20 28 views
10

No entiendo la siguiente declaración de la clase:¿Cuál es el propósito de tener nombres de clase entre los símbolos "Menos que" y "Mayor que" en C#?

public abstract class Class1 <TDomainServiceContract, TDomainService> 
{ 
    ... 
} 

Sé lo TDomainServiceContract y TDomainService son, pero por qué se utilizan entre el < y > símbolos?

+2

Ellos son [parámetros de tipo genérico] (http://msdn.microsoft.com/en-us/library/ms172192.aspx). – verdesmarald

+1

gracias, pero ¿por qué preguntas para cerrar esta cuestión, al igual que algunos otros usuarios, diciendo que no es una cuestión real? Veo que en mi "mensaje" no es un signo de interrogación, tal vez no se rinde en su navegador? Necesito entender cómo funciona este sitio ... –

Respuesta

26

Los parámetros entre la < y > son parámetros de tipo genérico. Los medicamentos genéricos, a un nivel muy alto, le permiten diseñar una clase que es agnóstico sobre el tipo particular, de uno o más de sus parámetros, propiedades o métodos. Es un poco difícil de explicar con palabras, pero el uso más común de los genéricos está en las colecciones.

Antes de genéricos, la mayoría de los desarrolladores utilizan cosas como ArrayList hacer un seguimiento de las colecciones de objetos. La desventaja de esto fue la seguridad; porque podría poner object en un ArrayList, eso significaba que tenía que volver a lanzar el objeto al tipo esperado (haciendo que el código fuera menos limpio), y no tenía nada que le impidiera agregar algo que no era ese tipo de objeto (es decir, que podría tener un ArrayList que podría estar esperando a contener sólo string objetos, pero podría - accidentalmente - poner en una int o una DbConnection, etc.), y que nunca iba a encontrar a cabo hasta que el tiempo de ejecución cuando el yeso ha fallado.

ArrayList myStrings = new ArrayList(); 

myStrings.Add("foo"); 
myStrings.Add("bar"); 
myStrings.Add(1); // uh-oh, this isn't going to turn out well... 

string string1 = (string)myStrings[0]; 
string string2 = (string)myStrings[1]; 
string string3 = (string)myStrings[2]; // this will compile fine but fail at 
             // runtime since myStrings[2] is an int, 
             // not a string 

Después de la introducción de los genéricos, obtuvimos la clase List<T>. Esta es una clase única que toma un solo argumento de tipo genérico, es decir, el tipo de objetos que espera que contenga la lista.De esta forma, puedo tener un List<string> o un List<int> que a) no requiera conversión, ya que los indexadores devuelven string y int, respectivamente, yb) estar seguro en tiempo de compilación, ya que sé que nada más que un string o un int (de nuevo, respectivamente) se puede poner en esas listas.

List<string> myStrings = new List<string>(); 

myStrings.Add("foo"); 
myStrings.Add("bar"); 
myStrings.Add(1); // this will not compile, as an int is not a string 

El punto de genéricos, es decir que no se preocupan por lo que el tipo real es del objeto que se está trabajando, pero el consumidor de su poder de clase. En otras palabras, la mecánica de cómo una lista podría almacenar un string, un int, un DbConnection, etc. son identicos, pero los genéricos hacen que esta información de tipo proveniente del consumidor de su clase no se pierda en su abstracción.

+2

+1 Estoy empezando a aprender C# y esto era exactamente lo que necesitaba. ¡Aclamaciones! – AlienWebguy

1

Indica que al usar la clase puede proporcionar cualquier tipo para el TDomainServiceContract que implementa DomainContext. Así que vamos a asumir una clase como esta:

public class MyDomainContext : DomainContext 
{ 
    ... 
} 

puedo usar esa clase al crear un nuevo Class1 así:

var o = new Class1<MyDomainContext, MyDomainService>(); 

ya que implementa DomainContext. Lo mismo ocurre con el TDomainService.

1

Otra forma de verlo es en un ejemplo más simple. Por ejemplo:

List<String> myStrings = new List<String>(); 
myStrings.Add("One"); 
//Etc. 

En este ejemplo, usted es simplemente identificar qué tipo de datos que va a utilizar con la clase. Situación similar en tu ejemplo.

Cuestiones relacionadas