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}" );
}
}
- 常用的懒加载线程安全单例,规范的常用写法:
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;
}
}
}