C# 静态类中构造、字段和属性等的执行顺序,含有单例模式分析

C# 静态类时我们实战项目开发中用的非常多的。有些时候可能他的执行顺序并非如我们认为的那样,那就快速来看一下吧!

在C#中,静态类的构造函数是在第一次访问该类的任何成员时执行的。静态构造函数是不可继承的,并且在访问静态类的任何静态成员之前,自动执行静态构造函数。

静态构造函数通常用于初始化静态类的静态成员,并且它们在静态类的生命周期内只执行一次。

静态类中的字段和属性的执行顺序与它们在类定义中的顺序相同。字段首先初始化,然后是属性

这里重点在于: 不管你是否访问字段,只要访问了静态类,所有的字段第一时间,按照顺序都初始化;但是对于属性,不会都初始化,不管你属性的定义顺序,永远也是等第一用时,才会初始化这个属性。

而构造函数,就是你用单例的new时,才会被第一次调用,所以基本上晚于第一个属性创建时。

下面是一个示例代码,演示了静态类中构造函数、字段和属性的执行顺序:

cs 复制代码
using System;
 
public class Program
{
    static Program()
    {
        Console.WriteLine("静态构造函数被执行");
    }
 
    public static int StaticField = PrintAndReturn(1, "静态字段初始化");
 
    public static int StaticProperty
    {
        get
        {
            Console.WriteLine("静态属性被访问");
            return PrintAndReturn(2, "静态属性返回值");
        }
    }
 
    public static int PrintAndReturn(int value, string message)
    {
        Console.WriteLine(message);
        return value;
    }
 
    static void Main()
    {
        Console.WriteLine("Main方法开始执行");
        Console.WriteLine($"StaticField: {Program.StaticField}" );
        Console.WriteLine($"StaticProperty: {Program.StaticProperty}" );
    }
}
  1. 常用的懒加载线程安全单例,规范的常用写法:
cs 复制代码
public class Singleton
{
    private static Singleton instance = null;
    private static readonly object padlock = new object();
 
    Singleton()
    {
    }
 
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
}
相关推荐
铅笔侠_小龙虾14 分钟前
Rust 学习目录
开发语言·学习·rust
云泽8081 小时前
从零吃透 C++ 异常:抛出捕获、栈展开、异常重抛与编码规范详解
开发语言·c++·代码规范
灯澜忆梦1 小时前
GO---可见性规则
开发语言·golang
逝水无殇1 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
这是个栗子2 小时前
前端开发中的常用工具函数(八)
开发语言·前端·javascript
凤凰院凶涛QAQ2 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
研☆香2 小时前
为什么变量声明在赋值前也能使用?—— 深入理解 JavaScript 变量提升与作用域
开发语言·前端·javascript
右耳朵猫AI2 小时前
PHP周刊2026W28 | 安全更新、Laravel 13.18、Twig 3.28
开发语言·php·laravel
second603 小时前
第一部分:快速上手 —— 建立 C++ 基本语法与编程范式
开发语言·c++
郝学胜-神的一滴3 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法