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# 单例模式详解

相关推荐
FL162386312914 小时前
[C#][winform]segment-anything分割万物部署onnx模型一键抠图演示
开发语言·c#
love530love16 小时前
OpenClaw 手机直连配置全流程
人工智能·windows·python·智能手机·c#·agent·openclaw
bcbobo21cn17 小时前
C# byte类型和byte数组的使用
开发语言·c#·字节数组·byte类型
月巴月巴白勺合鸟月半19 小时前
一次PDF文件的处理(一)
pdf·c#
大鹏说大话21 小时前
Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路
开发语言·c#
武藤一雄1 天前
WPF处理耗时操作的7种方法
microsoft·c#·.net·wpf
武藤一雄1 天前
C#常见面试题100问 (第一弹)
windows·microsoft·面试·c#·.net·.netcore
l1t1 天前
DeepSeek总结的用 C# 构建 DuckDB 插件说明
前端·数据库·c#·插件·duckdb
iReachers1 天前
恒盾C#混淆加密大师 1.4.5 最新2026版本发布 (附CSDN下载地址)
c#·c#混淆·c#加密·wpf加密·winform加密
历程里程碑1 天前
43. TCP -2实现英文查中文功能
java·linux·开发语言·c++·udp·c#·排序算法