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));
}
[...]
}
我真的不明白这是如何编译的。
答案 0 :(得分:7)
静态构造函数在需要的第一时间是 。确切的时间有点棘手,因为如果二进制文件中有beforefieldinit
这样的标志;您可能不需要过多担心细节,除非它在访问第一个类成员时运行,然后才需要。
好吧,为什么不呢? :) EventSystemBase<T, K>
形式的每种类型都是其拥有的独立类,并且与该类的其他泛型实例具有无关系,因此构造函数需要运行每一个人。它们在所有*方面都与运行时不同。
静态构造函数运行为“cooked”类型而不为“raw”类型(即运行版本,替换的泛型类型) ,所以这里没有真正的问题。
*实际上,运行时避免了创建引用类型泛型的重复实例。但这对程序员或程序来说并不重要。
答案 1 :(得分:2)
静态构造函数不适用于开放泛型类型。它只会在您指定类型参数时运行,例如EventSystemBase<MyEvent, MyAutoEvent>
,它实际上是一个不同的类,例如EventSystemBase<AnotherEvent, MyAutoEvent>
及其拥有的静态构造函数。在每个的情况下,静态构造函数在创建该单独类的第一个实例或引用其任何静态成员之前运行。
答案 2 :(得分:1)
如果它在当天应用了我的c ++知识......
泛型是在编译时生成的,它们被转换为许多单独和不同的类。对于每个类,静态构造函数在任何代码引用静态类之前运行。 CLR知道要引用哪些类型,因为每个类都是唯一。
EventSystemBase&lt; string , byte &gt;与EventSystemBase&lt; string , int &gt;完全没有关系。就好像你在源代码中编写了两个完全独立的类。
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);
}
}
答案 3 :(得分:0)
2-3。 1应该是明确的,它与T,K泛型相关联。