2016-03-15 94 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