2012-03-11 20:09:20|?次阅读|上传:wustguangh【已有?条评论】发表评论
C#编程时,属性、方法和字段等成员时对象实例所特有的,此外,还有静态成员,例如静态方法、静态属性或静态字段。静态成员可以再类的实例之间共享,所以可以将他们看做是类的全局对象。静态属性和静态字段可以访问独立于任何对象实例的数据,今天太方法可以执行与对象类型相关、但与对象实例无关的命令。在使用静态成员时,甚至不需要实例化对象。
许多情况下,许多静态属性和方法有很好的效果。例如,可以使用静态属性跟踪综合类创建了多少个实例。
使用类中的静态成员时,需要预先初始化这些成员。在声明时,可以给静态成员提供一个初始值,但有时需要执行更复杂的初始化,或者在赋值、执行静态方法之前执行某些操作。
使用静态构造函数可以执行此类初始化任务。一个类只能有一个静态构造函数,该构造函数不能有访问修饰符,也不能带任何参数。静态构造函数不能直接调用,只能在下述情况执行。
> 创建包含静态构造函数的类实例时
> 访问包含静态构造函数的类的静态成员时
在这两种情况下,会先调用静态构造函数。之后实例化类或访问静态成员。无论创建了多少个类的实例,其静态构造函数都只能调用一次。下面通过实际的源码介绍静态构造函数的用法。
示例:
public class Article : IXmlSerializable { /// <summary> /// 排序条件 /// </summary> public static Dictionary<string, string[]> orderMap = new Dictionary<string, string[]>(); /// <summary> /// 静态构造函数,对静态成员进行初始化 /// </summary> static Article() { //初始化排序字典 orderMap["DATE"] = new string[] { "pageInfo.modiDate:DESC", "pageInfo.modiTime:DESC" }; orderMap["HOT_DAY"] = new string[] { "pageInfo.vtoday:DESC", "pageInfo.modiDate:DESC" }; orderMap["HOT_WEEK"] = new string[] { "pageInfo.vweek:DESC", "pageInfo.modiDate:DESC" }; orderMap["HOT_MONTH"] = new string[] { "pageInfo.vmonth:DESC", "pageInfo.modiDate:DESC" }; orderMap["SCORES"] = new string[] { "pageInfo.vcount:DESC", "pageInfo.ccount:DESC" }; } //... }
1、静态构造函数既没有访问修饰符,也没有参数。
--因为是.NET调用的,所以像public和private等修饰符就没有意义了。
2、在创建第一个类实例或任何静态成员被引用时,.NET将自动调用静态构造函数来初始化类。
--也就是说我们无法直接调用静态构造函数,也不可能知道静态构造函数何时会被调用。
3、一个类只能有一个静态构造函数。
4、无参数的构造函数可以与静态构造函数共存。
--尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
5、最多只运行一次。
6、静态构造函数不可以被继承。
7、如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
下面用一个单例类Singleton的具体用法来补充说明静态构造函数的用法,代码如下:
public class MySingleton { private static readonly MySingleton _theOneAndOnly; static MySingleton() { _theOneAndOnly = new MySingleton(); } public static MySingleton TheOnly { get{ return _theOneAndOnly; } } /// <summary> /// Private constructor to avoid object created from outside /// </summary> private MySingleton() {} }