现在的位置: 首页 > 综合 > 正文

C#中静态构造函数的一些理解

2013年03月17日 ⁄ 综合 ⁄ 共 1578字 ⁄ 字号 评论关闭

首先,先看一张结论表

If(有类显式静态构造函数)
{
If(有访问静态成员)
{
在进入Main函数之后,第一次访问静态成员之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最多只能调用一次。
}
Else
{
不调用该类静态构造函数
}
}
Else
{
If(有访问静态成员)
{
在执行Main函数中的代码之前,先调用静态构造函数,以后将不再调用静态构造函数,同一个静态构造函数最多只能调用一次。
}
Else
{
不调用该类静态构造函数
}
}

1.下面先来验证一下上面的结论

public class Class_1
    {
        public static int i;
        static Class_1()   //显式定义静态构造函数
        {
            Console.WriteLine("Class_1:显示定义了静态构造函数");
            i = 1;
        }
    }

    public class Class_2
    {
        public static int i = Init(2);  //没有显式定义静态构造函数
        public static int Init(int j)
        {
            Console.WriteLine("Class_2:没有显示定义了静态构造函数");
            return j;
        }
    }

    public class MainClass
    {
        static void Main()
        {
            //分别分析以下几种情况的结果
        }
   }
1. 显示定义了静态构造函数,且有访问静态成员

static void Main()
{
///1.显示定义静态构造函数 2.有访问Class_1中的静态成员i
Console.WriteLine("Start In Main:");
Console.WriteLine(Class_1.i);
}

结果如下:

Start In Main:
Class_1:显示定义了静态构造函数
1

2. 显示定义了静态构造函数,且没有访问静态成员
static void Main()
{
///1.显示定义静态构造函数 2.没有访问Class_1中的静态成员i
Console.WriteLine("Start In Main:");
}

结果如下:
Start In Main:

3. 没有显示定义了静态构造函数,且有访问静态成员
static void Main()
{
///1.没有显示定义静态构造函数 2.有访问Class_2中的静态成员i
Console.WriteLine("Start In Main:");
Console.WriteLine(Class_2.i);
}
结果如下:
Class_2:没有显示定义了静态构造函数
Start In Main:
2
4.没有显示定义静态构造函数,且没有访问静态成员
static void Main()
{
///1.没有显示定义静态构造函数 2.没有访问Class_2中的静态成员
Console.WriteLine("Start In Main:");
}
结果如下:
Start In Main:

 参考资料:

  1.关于Type Initializer和 BeforeFieldInit的问题,看看大家能否给出正确的解释(http://www.cnblogs.com/artech/archive/2008/11/01/1324280.html)

      2.通过七个关键编程技巧得益于静态内容(http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/us0501StaticsinNET.mspx?mfr=true)

      3.静态构造函数的执行时机(http://www.cnblogs.com/happyhippy/archive/2007/04/04/710936.html)

      4.品味细节,深入.NET的类型构造器(http://www.cnblogs.com/anytao/archive/2008/11/02/must_net_23.html)

抱歉!评论已关闭.