码迷,mamicode.com
首页 > 其他好文 > 详细

静态构造函数, 静态成员初始化/调用顺序

时间:2017-06-04 18:41:44      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:names   class   string   stat   静态类   创建   运行   typeof   eric   

1)第一次调用类的任何成员之前,执行静态成员的初始化动作,执行顺序是:静态成员初始化--->静态构造函数--->调用类的某成员(构造器,静态字段/属性/函数,)

2)静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化。同1).

3)在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。调用静态构造函数之前会先做静态成员的初始化。同1),2)。

4)如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数。

5)在应用程序域的生存期内,静态类一直保留在内存中。

 

示例程序,main函数中分别打开TestCast1,2,3,4. 观察运行结果:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace static_const_readonly
{
    class MyClass
    {
        public static readonly int Count = 0;
        public static MyTest TEST = new MyTest();

        static MyClass()
        {
            Console.WriteLine("static MyClass() ctor.");
            TEST = new MyTest();
        }

        public static void FuncStatic()
        {
            Console.WriteLine("static void FuncStatic().");
        }

        public MyClass()
        {
            Console.WriteLine("MyClass() ctor");
        }
    }

    class MyTest
    {
        public MyTest()
        {
            Console.WriteLine("My Test ctor.");
        }
    }

    class Program
    {
         static void TestCast1()
        {
            Console.WriteLine("test starts.");
            MyClass myobject = new MyClass(); // call ctor
        }

         static void TestCast2()
         {
             Console.WriteLine("test starts.");
             Console.WriteLine("static MyClass.Count = {0}.", MyClass.Count); // get MyClass.Count
         }

        static void TestCast3()
        {
            Console.WriteLine("test starts."); // not refer to MyClass
            Console.WriteLine(typeof(MyClass));
        }

        static void TestCast4()
        {
            Console.WriteLine("test starts."); // not refer to MyClass
            MyClass.FuncStatic();
        }

        static void TestCast5()
        {
            Console.WriteLine("test starts."); // not refer to MyClass
        }

        static void Main(string[] args)
        {
            //TestCast1();
            //TestCast2();
            //TestCast3();
            TestCast4();
            // TestCast5();
        }
    }
}

TestCase1结果:

test starts.
My Test ctor.
static MyClass() ctor.
My Test ctor.
MyClass() ctor

TestCase2结果:

test starts.
My Test ctor.
static MyClass() ctor.
My Test ctor.
static MyClass.Count = 0.

TestCase3结果:

test starts.
static_const_readonly.MyClass

TestCase4结果:

test starts.
My Test ctor.
static MyClass() ctor.
My Test ctor.
static void FuncStatic().

TestCase5结果:

test starts.

 

总结:创建实例,引用/调用静态字段/函数会导致CLR 初始化静态成员和调用静态构造函数。只是获取type类型或者没有关于类的任何引用代码,静态成员的初始化和静态构造函数不会执行。

 

静态构造函数, 静态成员初始化/调用顺序

标签:names   class   string   stat   静态类   创建   运行   typeof   eric   

原文地址:http://www.cnblogs.com/dirichlet/p/3266019.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!