什么是静态构造函数的使用?

请向我解释静态构造函数的用法。 为什么和什么时候我们会创build一个静态构造函数,并有可能超载一个?

不,你不能超负荷; 静态构造函数对于初始化任何与types(或任何其他每类操作)相关的静态字段非常有用 – 特别适用于将所需的configuration数据读入只读字段等。

它在运行时第一次被自动运行(确切的规则是复杂的(参见“beforefieldinit”),并在CLR2和CLR4之间巧妙地改变)。 除非你滥用reflection,否则保证最多只运行一次(即使两个线程同时到达)。

来自静态构造函数(C#编程指南) :

静态构造函数用于初始化任何静态数据,或执行需要仅执行一次的特定操作。 它在创build第一个实例或引用任何静态成员之前自动调用。

静态构造函数具有以下属性:

  • 静态构造函数不会使用访问修饰符或参数。

  • 在创build第一个实例或引用任何静态成员之前,会自动调用一个静态构造函数来初始化该类。

  • 静态构造函数不能直接调用。

  • 用户在程序中执行静态构造函数时没有控制权。

  • 静态构造函数的典型用法是当类正在使用一个日志文件,并使用构造函数将条目写入此文件时。

  • 当构造函数可以调用LoadLibrary方法时,为非托pipe代码创build包装类时,静态构造函数也很有用。

当静态字段相互依赖时,静态构造函数也非常有用,因此初始化的顺序很重要。 如果通过格式化程序/美化程序来运行代码,这会改变字段的顺序,那么您可能会发现自己的空值并不是你期望的。

例如:假设我们有这个类:

 class ScopeMonitor { static string urlFragment = "foo/bar"; static string firstPart= "http://www.example.com/"; static string fullUrl= firstPart + urlFragment; } 

当你访问fullUr ,它将是“ http://www.example.com/foo/bar ”。

几个月后,你正在清理你的代码和字段的字母(假设他们是一个更大的列表的一部分,所以你没有注意到这个问题)。 你有:

 class ScopeMonitor { static string firstPart= "http://www.example.com/"; static string fullUrl= firstPart + urlFragment; static string urlFragment = "foo/bar"; } 

您的fullUrl值现在只是“ http://www.example.com/ ”,因为urlFragmentfullUrl设置时尚未初始化。 不好。 所以,你添加一个静态构造函数来照顾初始化:

 class ScopeMonitor { static string firstPart= "http://www.example.com/"; static string fullUrl; static string urlFragment = "foo/bar"; static ScopeMonitor() { fullUrl= firstPart + urlFragment; } } 

现在,不pipe你有什么样的顺序,初始化总是正确的。

1.只能访问课堂的静态成员。

原因:非静态成员是特定于对象实例的。 如果静态构造函数被允许在非静态成员上工作,它将反映所有对象实例中的变化,这是不切实际的。

静态构造函数中不应该有参数。

原因:既然,它将被CLR调用,没有人可以将parameter passing给它。 3.只允许有一个静态构造函数。

原因:重载需要两种方法在方法/构造函数定义方面不同,这在静态构造函数中是不可能的。

4.不应该有访问修饰符。

原因:同样的原因是相同的调用静态构造函数是由CLR而不是对象,不需要有访问修饰符

你可以使用静态构造函数来初始化静态字段。 它在这些字段被使用之前不确定的时间运行。 微软的文档和许多开发人员警告说,types上的静态构造函数会带来很大的开销。
最好避免静态构造函数的最大性能。
更新:不能在同一个类中使用多个静态构造函数,但是可以使用其他实例构造函数(最多)一个静态构造函数。

为什么和什么时候我们会创build一个静态构造函数…?

使用静态构造函数的一个具体原因是创build一个“超级枚举”类。 这是一个(简单的,人为的)例子:

 public class Animals { private readonly string _description; private readonly string _speciesBinomialName; public string Description { get { return _description; } } public string SpeciesBinomialName { get { return _speciesBinomialName; } } private Animals(string description, string speciesBinomialName) { _description = description; _speciesBinomialName = speciesBinomialName; } private static readonly Animals _dog; private static readonly Animals _cat; private static readonly Animals _boaConstrictor; public static Animals Dog { get { return _dog; } } public static Animals Cat { get { return _cat; } } public static Animals BoaConstrictor { get { return _boaConstrictor; } } static Animals() { _dog = new Animals("Man's best friend", "Canis familiaris"); _cat = new Animals("Small, typically furry, killer", "Felis catus"); _boaConstrictor = new Animals("Large, heavy-bodied snake", "Boa constrictor"); } } 

你会非常相似地使用它(在语法外观)任何其他枚举:

 Animals.Dog 

这比一个普通的enum的优点是你可以很容易地封装相关的信息。 一个缺点是你不能在switch语句中使用这些值(因为它需要不变的值)。

静态构造函数

使用静态修饰符声明的构造函数是静态构造函数。 静态构造函数用于初始化静态数据或执行需要在类的生命周期中仅执行一次的特定操作。 静态构造函数是在类中执行的第一个代码块。 静态构造函数在类的生命周期中只执行一次。 它被自动调用。 静态构造函数不带任何参数。 它没有访问说明符。 它不直接调用。

静态构造函数用于在第一次引用类时初始化静态数据成员,而实例构造函数用于使用关键字创build该类的实例。

资料来源: http : //www.c-sharpcorner.com/article/static-constructor-in-C-Sharp-and-their-usages/