C#编程使用静态成员和静态构造函数

2012-03-11 20:09:20|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C#|来源:唯设编程网

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()
 {}
}
<12>
发表评论0条 】
网友评论(共?条评论)..
C#编程使用静态成员和静态构造函数