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

相关推荐
yngsqq5 小时前
平面图环 内轮廓
c#
rockey6278 小时前
AScript之eval函数详解
c#·.net·script·eval·expression·动态脚本
He少年11 小时前
【AI 辅助案例分享】
人工智能·c#·编辑器·ai编程
工程师00713 小时前
栈和堆的概念
c#·栈和堆
不会编程的懒洋洋13 小时前
C# P/Invoke 基础
开发语言·c++·笔记·安全·机器学习·c#·p/invoke
Avalon71214 小时前
Unity3D响应式渲染UI框架UniVue
游戏·ui·unity·c#·游戏引擎
njsgcs14 小时前
solidworks折弯自动标注5 非90度折弯
c#·solidworks
狼与自由14 小时前
clickhouse引擎
clickhouse·c#·linq
wangnaisheng15 小时前
【C#】死锁详解:发生原因、优化解决方案
c#
tiger从容淡定是人生15 小时前
AI替代软件战略(一):从 CCleaner 到 MCP 架构重构 —— TigerCleaner 的工程实践
人工智能·重构·架构·c#·mcp