2010-08-09 10 views
22

Estoy intentando crear una clase genérica que tendrá algunas funciones estáticas basadas en el tipo. ¿Hay miembros estáticos para cada tipo? ¿O solo donde se usa un genérico? La razón por la que pregunto es que quiero un objeto de bloqueo para cada tipo, no uno compartido entre ellos.Son miembros estáticos de clases genéricas compartidas entre tipos

Así que si tuviera

class MyClass<T> where T:class 
{ 
    static object LockObj = new object(); 
    static List<T> ObjList = new List<T>(); 
} 

entiendo que ObjList sin duda tendría un objeto diferente creado para cada tipo genérico utilizado, pero me la LockObj ser diferente entre cada instancia genérica (MyClass<RefTypeA> y MyClass<RefTypeB>) o el mismo ?

Respuesta

17

¡Solo compruébalo tú mismo!

public class Static<T> 
{ 
    public static int Number { get; set; } 
} 

static void Main(string[] args) 
{ 
    Static<int>.Number = 1; 
    Static<double>.Number = 2; 
    Console.WriteLine(Static<int>.Number + "," + Static<double>.Number); 
} 
// Prints 1, 2 
+0

Estaba preocupado por los casos de esquina. Aún así, parece que los tdd tienen la cabeza en el lugar correcto – Spence

+0

@tzaman, ¿pueden explicar esto luego: http://stackoverflow.com/questions/35048279/protected-static-string-accessability-issue-in-c-sharp? noredirect = 1 # comment57871825_35048279 – bpeikes

7

Será diferente para cada T. Básicamente, para todas las diferentes T, tendrá diferentes tipos y los miembros no se compartirán entre los diferentes tipos.

4

Los tipos genéricos instanciados en C# son en realidad tipos diferentes en tiempo de ejecución, por lo tanto, los miembros estáticos no se compartirán.

+1

Estaba preocupado porque entendía que cada tipo de valor tenía un conjunto diferente de código, pero los tipos de referencia usaban el mismo conjunto de código "genérico" con una restricción de tipo diferente. Solo estoy buscando casos de esquina. – Spence

Cuestiones relacionadas