none
请教一下C#中静态构造函数在内存中是如何执行的 RRS feed

  • 问题

  • 请教一下C#中静态构造函数在内存中是如何执行的,有的讲是在类载入内存时执行,请问类载入内存是指类载入代码区还是指载入数据区。请多多指教谢谢!!!
    2010年5月28日 3:04

答案

  • 静态构造函数只执行一次,只要你使用到了这个类(无论是使用到它的哪个部分,以及这个部分是静态还是动态的),且由于其它任何函数,为验证如下:

     class TestStaticConstructure
        {
            public TestStaticConstructure()
            {
                Console.WriteLine("我是一般构造函数");
            }
            static TestStaticConstructure()
            {
                Console.WriteLine("我是静态构造函数");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                new TestStaticConstructure();
                new TestStaticConstructure();
            }
        }

    自行比较输出结果,考虑是不是这样?

    2010年5月28日 3:45
    版主
  • class TestStaticConstructure
        {
            public TestStaticConstructure()
            {
                Console.WriteLine("我是一般构造函数");
            }
            static TestStaticConstructure()
            {
                Console.WriteLine("我是静态构造函数");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                TestStaticConstructure obj;

                new TestStaticConstructure();
            }
        }

    2010年5月28日 4:00
  • 你好!

         静态构造函数的执行时刻并不确定,CLR会须选择下列时间之一来调用静态构造函数:

         1,类型的第一个实例创建之前,或则在类型的非继承成员对一次被访问之前,这里说的“之前”是紧接着的

         2,类型的非继承静态字段被第一次访问之前的某个时刻,这里的“之前”并没有紧接着的意思,只是之前的某个时刻而已!

         编译器会选择对我们的类型最有意义的语义,通过设置beforefieldinit标记告诉CLR这个选择。由于这个时刻不确定,所以不要编写依赖特定静态构造函数执行顺序的代码,这不可靠!

        希望这个解释对你有帮助!


    周雪峰
    2010年5月28日 4:18
    版主
  • 你好 有一点可以保证的是 在访问类型的静态字段之前会被执行静态构造函数 且在一个应用程序域中仅执行一次

    这一般用于Singleton单件模式


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~

    2010年5月28日 7:19
    版主

全部回复

  • 静态构造函数只执行一次,只要你使用到了这个类(无论是使用到它的哪个部分,以及这个部分是静态还是动态的),且由于其它任何函数,为验证如下:

     class TestStaticConstructure
        {
            public TestStaticConstructure()
            {
                Console.WriteLine("我是一般构造函数");
            }
            static TestStaticConstructure()
            {
                Console.WriteLine("我是静态构造函数");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                new TestStaticConstructure();
                new TestStaticConstructure();
            }
        }

    自行比较输出结果,考虑是不是这样?

    2010年5月28日 3:45
    版主
  • class TestStaticConstructure
        {
            public TestStaticConstructure()
            {
                Console.WriteLine("我是一般构造函数");
            }
            static TestStaticConstructure()
            {
                Console.WriteLine("我是静态构造函数");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                TestStaticConstructure obj;

                new TestStaticConstructure();
            }
        }

    2010年5月28日 4:00
  • 你好!

         静态构造函数的执行时刻并不确定,CLR会须选择下列时间之一来调用静态构造函数:

         1,类型的第一个实例创建之前,或则在类型的非继承成员对一次被访问之前,这里说的“之前”是紧接着的

         2,类型的非继承静态字段被第一次访问之前的某个时刻,这里的“之前”并没有紧接着的意思,只是之前的某个时刻而已!

         编译器会选择对我们的类型最有意义的语义,通过设置beforefieldinit标记告诉CLR这个选择。由于这个时刻不确定,所以不要编写依赖特定静态构造函数执行顺序的代码,这不可靠!

        希望这个解释对你有帮助!


    周雪峰
    2010年5月28日 4:18
    版主
  • 你好 有一点可以保证的是 在访问类型的静态字段之前会被执行静态构造函数 且在一个应用程序域中仅执行一次

    这一般用于Singleton单件模式


    I see you~http://hi.baidu.com/1987raymondMy Blog~~~

    2010年5月28日 7:19
    版主
  • 不好意思你说的我还是不太理解如果可以能加我的QQ:382245409吗我想在请教你一下。谢谢!!!
    2010年5月29日 4:13
  • 你好!

         请问你是要联系我,还是Raymond Tang版主呢?


    周雪峰
    2010年5月29日 5:15
    版主
  • 是的我想请教您周雪峰,您可以加我QQ:382245409吗
    2010年5月29日 13:17
  • 你好!已经添加了你的QQ了,有时间多交流啊!

    周雪峰
    2010年5月29日 13:56
    版主