Item13: Initialize Static Class Members with Static Constructiors
我们知道应当在创建类型的所有实例之前首先初始化静态成员变量。C#让我们使用静态初始化和静态构造函数来达到这个目的。静态构造函数是一种特殊的函数,它会在类中的所有的方法、成员变量或者属性定义之前运行。我们使用这个方法在类中来声明静态变量,构造singleton设计模式或者其他需要的工作。我们不应当使用默认的构造函数,一些特殊的私有函数或者其他的声明静态变量的方法。
就像实例的初始化一样,我们可以使用静态构造函数来声明静态成员变量。如果仅仅是需要简单的静态成员变量,我们可以使用初始化的方法。如果我们需要使用较为复杂的逻辑时,我们就需要使用静态成员变量的构造函数来创建它们。
在C#的涉及模式中,Singleton模式是我们经常要用到的。我们只要将类的实例化构造函数设为private,再添加对静态成员的初始化:
{
private static readonly MySingleton _theOneAndOnly = new MySingleton();
public static MySingleton TheOnly
{
get
{
return _theOneAndOnly;
}
}
private MySingleton()
{
}
}
Singleton模式可以被简单的使用下面的方法来达到。
{
private static readonly MySingleton _theOneAndOnly;
static MySingleton()
{
_theOneAndOnly = new MySingleton();
}
public static MySingleton TheOnly
{
get
{
return _theOneAndOnly;
}
}
private MySingleton()
{
}
}
就像实例的初始化一样,静态成员变量的初始化会在静态构造函数被调用之前执行。
当我们的应用程序第一次装载我们的类型时,CLR会调用我们的静态构造函数。我们只能定义一个静态构造函数,并且它不能拥有参数。因为静态构造函数是被CLR调用的,因此我们必须小心它可能会引起异常。一旦其中包含异常,CLR就会中止我们的程序。我们不直接对静态变量进行初始化而是使用静态构造函数的原因也在于此。通过静态构造函数,我们可以比较容易得捕获这些异常。
{
try
{
_theOneAndOnly = new MySingleton();
}
catch
{
//捕获异常
}
}
静态初始化和静态构造函数提供了更清洁和更简便的方法来声明我们类型中的静态成员。它们更容易被人理解,也更容易进行调试。
译自 Effective C#:50 Specific Ways to Improve Your C# Bill Wagner著
回到目录