假设我有一个带有静态构造函数的MySingleton类。
我希望在我的应用启动时立即创建单身人士
有没有办法做到这一点,而不必在应用程序启动时编写MySingleton.Instance.MyMethod ...只是为了单例调用静态构造函数?我不太确定这是否可行,但我在那里抛出问题。
谢谢,
答案 0 :(得分:3)
有没有办法让应用程序启动时自动创建一个类的实例。
是。将创建逻辑放在静态构造函数中,然后将Main放在该类中。静态构造函数总是在类的任何方法之前调用,而Main是类的方法。
如果你不能把Main放在那个班级那么没有。静态构造函数将由(1)调用类上的任何静态方法,或(2)创建类的实例来触发。
答案 1 :(得分:1)
不,实例化只会根据初始成员访问权限进行。
出于好奇,为什么在需要之前需要将它实例化?
答案 2 :(得分:1)
来自When is a static constructor in C# called?:
由。调用静态构造函数 以下任何一项中的第一项 条件:
Create an instance of the class. Refer any of the static methods of the class.
因此,如果您的构造函数既是静态的又是私有的,那么您将不得不引用其中一种方法。如果没有,你可以调用构造函数。
答案 3 :(得分:1)
AFAIK,无法从加载的程序集中执行代码。调用程序集应通过从程序集中实例化类型或调用静态方法来引用此程序集。此外,还有一个Assembly Loaded事件可用于在加载某个程序集时执行代码,但如上所述,您只能在调用程序集中使用它(而不是正在加载的程序集)。启动计时器的最简单方法可能是调用静态方法,就像其他人建议的那样。
答案 4 :(得分:0)
只需调用Singleton上的任何方法,它就会被实例化。
答案 5 :(得分:0)
如果你想直接调用静态构造函数,那实际上非常简单。
在main方法中,输入以下代码:
RuntimeHelpers.RunClassConstructor(typeof(MySingleton).TypeHandle);
这个方法意味着只能被编译器使用,所以可能会有一些我不知道的注意事项 - 我只知道该方法,因为我自己的编译器需要运行类特定时间的初始化者。
注意:此方法遵循初始化规则,并确保初始化程序永远不会运行两次,等等。
答案 6 :(得分:0)
您可以使用模块初始值设定项。不幸的是,这个CLR功能在C#中不可用。但是你可以使用像this one这样的后编译器。