Effective C# Item13: Initialize Static Class Members with Static Constructiors

Item13: Initialize Static Class Members with Static Constructiors

      我们知道应当在创建类型的所有实例之前首先初始化静态成员变量。C#让我们使用静态初始化和静态构造函数来达到这个目的。静态构造函数是一种特殊的函数,它会在类中的所有的方法、成员变量或者属性定义之前运行。我们使用这个方法在类中来声明静态变量,构造singleton设计模式或者其他需要的工作。我们不应当使用默认的构造函数,一些特殊的私有函数或者其他的声明静态变量的方法。

      就像实例的初始化一样,我们可以使用静态构造函数来声明静态成员变量。如果仅仅是需要简单的静态成员变量,我们可以使用初始化的方法。如果我们需要使用较为复杂的逻辑时,我们就需要使用静态成员变量的构造函数来创建它们。

      在C#的涉及模式中,Singleton模式是我们经常要用到的。我们只要将类的实例化构造函数设为private,再添加对静态成员的初始化:

None.gif public   class  MySingleton
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      
private static readonly MySingleton _theOneAndOnly = new MySingleton();
InBlock.gif      
public static MySingleton TheOnly
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                  
return _theOneAndOnly;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif      }

InBlock.gif      
private MySingleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
ExpandedSubBlockEnd.gif      }

ExpandedBlockEnd.gif}

      Singleton模式可以被简单的使用下面的方法来达到。

None.gif public   class  MySingleton
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      
private static readonly MySingleton _theOneAndOnly;
InBlock.gif      
static MySingleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif             _theOneAndOnly 
= new MySingleton();
ExpandedSubBlockEnd.gif      }

InBlock.gif      
public static MySingleton TheOnly
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                  
return _theOneAndOnly;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockEnd.gif      }

InBlock.gif      
private MySingleton()
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
ExpandedSubBlockEnd.gif      }

ExpandedBlockEnd.gif}

      就像实例的初始化一样,静态成员变量的初始化会在静态构造函数被调用之前执行。

      当我们的应用程序第一次装载我们的类型时,CLR会调用我们的静态构造函数。我们只能定义一个静态构造函数,并且它不能拥有参数。因为静态构造函数是被CLR调用的,因此我们必须小心它可能会引起异常。一旦其中包含异常,CLR就会中止我们的程序。我们不直接对静态变量进行初始化而是使用静态构造函数的原因也在于此。通过静态构造函数,我们可以比较容易得捕获这些异常。

None.gif static  MySingleton()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif      
try
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            _theOneAndOnly 
= new MySingleton();
ExpandedSubBlockEnd.gif      }

InBlock.gif      
catch
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif            
//捕获异常
ExpandedSubBlockEnd.gif
      }

ExpandedBlockEnd.gif}

      静态初始化和静态构造函数提供了更清洁和更简便的方法来声明我们类型中的静态成员。它们更容易被人理解,也更容易进行调试。

      译自   Effective C#:50 Specific Ways to Improve Your C#                      Bill Wagner著

      回到目录

转载于:https://www.cnblogs.com/aiyagaze/archive/2006/10/11/526136.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值