2016-03-15 96 views
3

一个静态泛型类可以有多个单个实例吗?通用静态类有多个实例?

标准静态类只有一个实例,对吗?就像这样:

public static class MyClass 
{ 
    public static string MyString { get; set; } 
} 

public void ExampleMethod(int id) 
{ 
    if (id > 0) 
     MyClass.MyString = id.ToString(); 
} 

无处不在我的计划,MyClass代表一个单一实例,即应用范围的

好的,但是,如果MyClass是通用的呢?

public static class MyClass<T> 
{ 
    public static string MyString { get; set; } 
    public static T MyT { get; set; } 
} 

意味着对于指定每种类型的参数,我应用范围将创建一个新的实例?或者它会为每个可能的类型参数创建一个单独的实例? (我真希望事实并非如此)

对于逻辑,它不能仍然是一个实例,因为我可以做:

public void ExampleMethod(int id) 
{ 
    MyClass<int>.MyT = id; 
    MyClass<DateTime>.MyT = DateTime.Now; 
    MyClass<string>.MyT = "Hello, World"; 
    MyClass<DayOfWeek>.MyT = DayOfWeek.Monday; 
} 

预先感谢所有答复

更新 - 微软的.Net团队已经使用

一不留神,我发现了一个静态泛型类的使用的一个例子,建成mscorlib DLL:

// Decompiled with JetBrains decompiler 
// Type: EmptyArray`1 
// Assembly: mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 
// MVID: 7D59CE68-D0F6-428F-B71C-C8D703E59C19 
// Assembly location: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscorlib.dll 

internal static class EmptyArray<T> 
{ 
    public static readonly T[] Value = new T[0]; 
} 

该类的存在意味着应用程序范围将创建一个空数组(如果尚未为给定类型创建的话(也许数组是内存猎手对象)。

+2

这并不是说有多个实例,但有多种类型。 'MyClass '是与“MyClass ”不同的类型。没有实例。 –

回答

4

是的,即时生成泛型类的非泛型版本。这意味着每个静态变量在您的泛型类的生成的非泛型版本(是的,另一个Type)的上下文中是静态的。

为了解决这个问题,您可以在泛型类之外创建一个单例模式类,其中所有静态变量都应该在所有版本之间共享。

+0

有意义:'typeof(MyStatic <>)。MakeGenericType(typeof(string))'是有效的代码,就像我的问题代码。知道了谢谢! –

3

Patrick已经得到了解决方案,我只是添加一些信息。

其实当你的类是静态的时候,根本不存在它的实例,不管类是否是泛型的。然而,你的意思是泛型类的所有实现 - 例如MyClass<int>,MyClass<string>等 - 是完全不同的类型,它们被编译到不同的类中,彼此之间不知道任何东西,它们甚至不实现相同的基类-类。

+0

有没有关于此的任何文档?另外,你认为它是否足够“干净”? – Rick

+0

@Rick“干净”是什么意思? – HimBromBeere

+0

干净的代码友好 – Rick