2011-04-12 137 views
6
public abstract class EventSystemBase<T, K> : IAutoEvent 
    where T : Event 
    where K : IAutoEvent, new() 
{ 
    public static T Instance { get { return EventSystem.Events.OfType<T>().FirstOrDefault(); } } 
    public static IAutoEvent AutoEventInstance { get { return new K(); } } 

    static EventSystemBase() 
    { 
     EventBot.Register(new EventBotEntry(Instance.Name, AutoEventInstance)); 
    } 

    [...] 
} 

我真的不明白這是如何編譯的。泛型類型的靜態構造函數如何工作?

  • 何時運行靜態構造函數?
  • 爲什麼我可以在靜態成員中使用泛型類型?
  • 它應該如何知道應用哪些類型?

回答

7
  • 靜態構造函數是在第一時間它是需要。確切的時間是有點棘手,因爲如果在二進制中像beforefieldinit標誌;您可能不需要擔心過多的細節,只是在需要訪問第一個類成員時運行它。

  • 那麼,爲什麼不呢? :)形式EventSystemBase<T, K>的每種類型是其自己的單獨的類和承擔沒有關係到類的其他通用實例,所以構造函數需要爲每個類運行。它們在所有*方面都與運行時不同。

  • 靜態構造函數運行一個「熟」型和「原始」類型(即它運行的版本泛型類型取代),所以這裏沒有真正的問題。

*實際上,運行時避免了創建引用類型泛型的重複實例。但這對於程序員或程序來說並不重要。

0

如果應用從我的C++知識早在一天一樣...

泛型是在編譯時 產生,他們被轉換成許多獨立和獨特類。對於每個類,靜態構造函數在任何代碼引用靜態類之前運行。 CLR知道哪些類型可供參考,因爲每個類別都是唯一的

EventSystemBase < 字節>與EventSystemBase < INT絕對沒有任何關係>。就好像你已經在源代碼中編寫了兩個完全分離的類。

class Program 
{ 
    public static void Main() 
    { 
     var myInt = new MyGeneric<int>(); 
     myInt.InstanceMethod(); 
     MyGeneric<int>.StaticMethod(); 

     MyGeneric<long>.StaticMethod(); 
     var myLong = new MyGeneric<long>(); 
     myLong.InstanceMethod(); 

     Console.ReadLine(); 
    } 
} 

public class MyGeneric<T> 
{ 
    static MyGeneric() 
    { 
     Console.WriteLine("Static constructor: {0}", typeof(T).Name); 
    } 

    public static void StaticMethod() 
    { 
     Console.WriteLine("Static method: {0}", typeof(T).Name); 
    } 

    public void InstanceMethod() 
    { 
     Console.WriteLine("Instance method: {0}", typeof(T).Name); 
    } 
} 
+4

泛型不是在編譯時產生的! – Mehrdad 2011-04-12 01:32:03

+0

儘管語法相似,但C#泛型與C++模板的工作方式不同。 – 2011-04-12 01:38:43

+0

以外的編譯位,它是正確的?此外,他們打消了我的防XSS插入符...否則我第二次到最後一句會更有意義:(從 – 2011-04-12 01:41:09

2

靜態構造函數不適用於開放泛型類型。它只會在您指定類型參數時運行,例如EventSystemBase<MyEvent, MyAutoEvent>,它實際上是與EventSystemBase<AnotherEvent, MyAutoEvent>不同的類,其自己的靜態構造函數。在每個的情況下,靜態構造函數在創建該單獨類的第一個實例或引用其任何靜態成員之前運行。

+0

實際上是從我正在測試什麼,它顯示靜態成員在基類Foo 由Foo 和Foo共享 bevacqua 2011-04-12 01:43:59

+0

'class Foo {public static int x = 0;}'Foo .x = 10;''Console .WriteLine(Foo .x)// still zero' – 2011-04-12 01:51:34

0
  1. 每當調用不同的< T,K>泛型類時,泛型上的靜態構造函數就會被調用。

2-3。 1應該清楚,它是相關型號爲T,K通用

相關問題