代码改变世界

类静态和实例化执行顺序优先级(静态构造函数、静态变量、静态方法)

2015-11-16 14:59  Lasthelloworld  阅读(1789)  评论(1编辑  收藏  举报

总结结果:

对于一个类执行顺序:
隐式静态变量初始化、静态函数初始化(隐式调用静态构造函数情况下,会在程序运行开头执行)>显式静态变量初始化、静态函数初始化(显式调用静态构造函数情况下,在使用类名时候就进行初始化操作)>静态构造函数执行>类实例化>变量初始化>函数初始化>构造函数初始化

总结:
对于静态调用和实例化调用,执行顺序“先静态域,后实例化域,先隐式,后显式”
对于变量、函数、构造函数执行顺序“先变量声明、再函数声明、最后构造函数”

 

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

namespace StaticClassDemo
{
    //该类为隐式调用构造函数,会在访问StaticClassA类名之前运行,
    public class StaticClassA
    {
        public  string staticMem = ShowStaticStr("A Static Member");
     
        public static string ShowStaticStr(string message) {

            Console.WriteLine(message);
            return message;
        }
    }
}
StaticClassA
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StaticClassDemo
{
    public  class StaticClassB
    {
        //该类中有隐式调用静态函数
        public static string staticMem = ShowStaticStr("B Static Member");  
       
        public static string ShowStaticStr(string message)  
           {  
               Console.WriteLine(message);  
               return message;  
           }  
  

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

namespace StaticClassDemo
{
    //该类中有显式调用静态函数
   public class StaticClassC
    {
        public static string staticMem = ShowStaticStr("C Static Member");
        public static string ShowStaticStr(string message)
        {
            Console.WriteLine(message);
            return message;
        }  
        static StaticClassC()
        { Console.WriteLine("静态构造函数C执行"); }  
    }
}
StaticClassC
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StaticClassDemo
{
    class StaticClassD
    {
            public   string staticMem = ShowStaticStr("D Static Member");  
            public static string ShowStaticStr(string message)  
            {  
                Console.WriteLine(message);  
                return message;  
            }  
  
            static StaticClassD()
            { Console.WriteLine("静态构造函数D执行"); }  
    }
}
StaticClassD
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StaticClassDemo
{
    public class StaticClassE
    {
        public static string staticName = "E static Member static Name";
        public string Name = ShowStaticStr("E Static Member Name");

        public StaticClassE()
        {
            Console.WriteLine("完成初始化E");
        }

        public static string ShowStaticStr(string message)
        {
            Console.WriteLine(message);
            return message;
        }

        public   string ShowStr(string message)
        {
            Console.WriteLine(message);
            return message;
        }  
    }
}
StaticClassE
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace StaticClassDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //StaticClassA 静态字段 
            //C#构造函数分为静态构造函数和实例构造函数。
            //静态构造函数会在类的静态变量、方法等静态属性生成之后或者在new一个新的对象之前时被调用,隐式构造函数的类的静态变量、静态函数初始化会在程序开始之前执行
            //实例构造函数在new一个新的对象时执行

            //执行顺序:1.执行B类静态变量初始化生成(B类为隐式静态函数,B类的静态变量先初始化生成)
            Console.WriteLine("A EntryPoint");
            //执行顺序:2.执行A类变量初始化生成(A该类为隐式静态函数,但A类的变量为非静态,所以在B类静态变量初始化之后,变量、函数调用之前生成),再执行A类实例化调用staticMem变量
            Console.WriteLine(new StaticClassA().staticMem);
            //执行顺序:3.执行A类静态方法
            StaticClassA.ShowStaticStr("Call A Static Method");

           
            Console.WriteLine("************************************************************");

            //执行顺序:4.执行B类静态字段调用显示(B类为隐式静态函数,在程序开始之前最先初始化了B类的静态变量)
            Console.WriteLine(" B EntryPoint");
            Console.WriteLine(StaticClassB.staticMem);
            //执行顺序:5.执行B类静态方法
            StaticClassB.ShowStaticStr("Call B Static Method");

            Console.WriteLine("************************************************************");

            Console.WriteLine("C EntryPoint");
            //执行顺序:6.执行C类静态字段初始化显示(C类为显式静态函数,先初始化C类的静态变量,之后才调用C类的构造函数)
            //执行顺序:7.执行C类静态字段调用显示
            Console.WriteLine(StaticClassC.staticMem);
            //执行顺序:8.执行C类静态函数调用
            StaticClassC.ShowStaticStr("Call C Static Method");
 

            Console.WriteLine("************************************************************");
            //执行顺序:9.执行D类静态构造函数,因为D类实例化后才能调用非静态变量
            Console.WriteLine("D EntryPoint");
            //执行顺序:10.执行D类调用变量
            Console.WriteLine(new StaticClassD().staticMem);
            //执行顺序:11.执行D类静态函数调用
            StaticClassD.ShowStaticStr("Call D Static Method");

            Console.WriteLine("************************************************************");

            Console.WriteLine("E EntryPoint");
            var e =  new StaticClassE();
            Console.WriteLine(e.Name);
            Console.WriteLine(StaticClassE.staticName);
            Console.WriteLine(e.ShowStr("Call E Method"));
            Console.WriteLine(StaticClassE.ShowStaticStr("Call E Static Method"));
            Console.Read();  
        }
    }
}
调用演示

 

 

 运行结果: