C# 静态构造函数与类的初始化

静态构造函数:

基本概念:

静态构造函数用于初始化任何静态数据。

静态构造函数的常见特性:

  • 静态构造函数不使用访问修饰符或不具有参数。因为静态构造函数由系统调用,无法人为调用,所以就不存在public、private等。
  • 类或结构只能有一个静态构造函数(普通的构造函数可以有多个,因为函数由函数名加参数确定的)。
  • 静态构造函数不能继承或重载。
  • 静态构造函数不能直接调用,并且仅应由公共语言运行时 (CLR) 调用。 可以自动调用它们。
  • 自动调用静态构造函数。将在创建第一个实例或引用任何静态成员之前自动调用静态构造函数。
  • 静态构造函数在实例构造函数之前运行。
  • 静态字段的初始化会按照在类中的声明顺序执行。 初始值设定项紧接着执行静态构造函数之前运行。
  • 静态函数的执行过程是线程私有,不能被其他线程进入
  • 静态构造函数最多调用一次

不能出现修饰符:

类的初始化顺序:

本类的静态代码区→父类的静态代码区→父类的实例代码区→本类的实例代码区;

例如:

cs 复制代码
using System;

class Temp
{
    public Temp()
    {
        Console.WriteLine("Done Temp!");
    }
}


class A
{


    static A()
    {
        Console.WriteLine("Done static A()!");
    }

    public A()
    {
        Console.WriteLine("Done A()!");
    }
}

class B : A
{
    static B()
    {
        Console.WriteLine("Done static B()!");
    }

    public B()
    {
        Console.WriteLine("Done B()!");
    }
}

class C : B
{
    static C()
    {
        Console.WriteLine("Done static C()!");
    }

    public C()
    {
        Console.WriteLine("Done C()!");
    }
}
class Run
{
    static void Main()
    {
/*        A a = new A();*/
        C c = new C();
        Console.ReadLine();
    }
}

执行的结果是


在静态代码区中,先执行静态字段的初始化,再执行静态构造函数,不管两者在类内的实现顺序如何;

cs 复制代码
using System;

class Temp1
{
    public Temp1()
    {
        Console.WriteLine("Done Temp1!");
    }
}

class Temp2
{
    public Temp2()
    {
        Console.WriteLine("Done Temp2!");
    }
}



class A
{

    static A()
    {
        Console.WriteLine("Done static A()!");
    }

    private static Temp2 temp2 = new Temp2();
    private static Temp1 temp1 = new Temp1();


    public A()
    {
        Console.WriteLine("Done A()!");
    }
}
class Run
{
    static void Main()
    {
        A a = new A();
        /*        C c = new C();*/
        Console.ReadLine();
    }
}
cs 复制代码
class A
{
    private static Temp2 temp2 = new Temp2();
    private static Temp1 temp1 = new Temp1();

    static A()
    {
        Console.WriteLine("Done static A()!");
    }


    public A()
    {
        Console.WriteLine("Done A()!");
    }
}

修改A类中静态字段和静态构造函数的位置,程序的结果是一样的;

但是修改各个字段的实现位置,结果会发生变化

cs 复制代码
class A
{
    private static Temp1 temp1 = new Temp1();
    private static Temp2 temp2 = new Temp2();


    static A()
    {
        Console.WriteLine("Done static A()!");
    }


    public A()
    {
        Console.WriteLine("Done A()!");
    }
}

实例代码区也是一样的;

个人理解:

类分为静态区和非静态区,静态区包含静态字段,静态方法和静态构造函数;

静态区属于类,而不属于任何类的实例;

参考文档:

c#中文文档

C#--静态构造函数

C# 单例模式详解

相关推荐
黑洞视界17 分钟前
NCC Mocha v0.2.0 发布, 新增对 Metrics 的支持
c#·.net·可观测性·observability
FAREWELL000751 小时前
Unity基础学习(十五)核心系统——音效系统
学习·unity·c#·游戏引擎
zimoyin2 小时前
Java 快速转 C# 教程
java·开发语言·c#
向宇it2 小时前
【unity游戏开发——编辑器扩展】使用MenuItem自定义菜单栏拓展
开发语言·ui·unity·c#·编辑器·游戏引擎
动感光博3 小时前
Unity碰撞检测(射线投射、胶囊体投射)、交互(图层、掩码)
unity·c#·游戏引擎·游戏程序·动画
动感光博5 小时前
Unity(URP渲染管线)的后处理、动画制作、虚拟相机(Virtual Camera)
开发语言·人工智能·计算机视觉·unity·c#·游戏引擎
hie988947 小时前
C#与KepOPC通讯
开发语言·c#
hweiyu008 小时前
C#学习教程(附电子书资料)
开发语言·学习·c#
csdn_aspnet10 小时前
C# DataGridView 选中所有复选框
c#·winform·datagridview
qq_2979080113 小时前
c#车检车构客户管理系统软件车辆年审短信提醒软件
sqlserver·c#·开源软件