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;
        }
    }
}
相关推荐
江屿风2 分钟前
【C++笔记】vector流食般投喂
开发语言·c++·笔记
星恒随风4 分钟前
Python 基础语法详解(3):顺序语句、条件语句和循环语句一篇讲清楚
开发语言·笔记·python·学习
CHHH_HHH4 分钟前
【C++】红黑树:比AVL树更实用的平衡二叉搜索树
开发语言·数据结构·c++·算法·stl
牛油果子哥q7 分钟前
【C++内存对齐与结构体填充】C++内存对齐与结构体填充深度精讲:对齐规则、结构体内存大小计算、填充冗余、笔试真题与工程优化方案
开发语言·c++
ch.ju9 分钟前
Java程序设计(第3版)第四章——set-get方法
java·开发语言
智能制造产品经理代码提升10 分钟前
快速搭建PayPal标准API测试框架
开发语言·lua
智能制造产品经理代码提升11 分钟前
Postman批量CaptureID全自动查询
开发语言·lua
爱喝水的鱼丶12 分钟前
SAP-ABAP:SAP 内存管理详解:从架构到优化
开发语言·学习·架构·sap·abap·内存管理
专注VB编程开发20年12 分钟前
C#,VB.NET 生成debug日志文件
服务器·数据库·c#
AI刀刀14 分钟前
文心粘贴到 word 格式混乱,AI 导出鸭智能转文档零失真
人工智能·c#·word·ai导出鸭