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


    总结结果:

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

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

    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();  
            }
        }
    }
    调用演示

     运行结果:

  • 相关阅读:
    IntelliJ IDEA注册码
    linux中patch命令 -p 选项
    设备文件简介
    《算法导论》——矩阵
    《算法导论》——数论
    linux常用查看硬件设备信息命令(转载)
    netstat和telnet命令在Windows7中的用法(转载)
    c++容器使用总结(转载)
    离散数学——数论算法
    c语言中内存对齐问题
  • 原文地址:https://www.cnblogs.com/lasthelloworld/p/4968913.html
Copyright © 2020-2023  润新知