C#中静态构造函数

本文介绍了C#中静态构造函数的使用场景及其特点。通过示例解释了如何利用静态构造函数初始化类中的静态成员,并展示了如何结合DateTime类实现特定功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用静态构造函数的一个原因是:在第一次使用类之前,用静态构造函数来初始化类(当然也包括结构体,这里用类做阐述)中一些静态字段或属性。比如对字段或属性进行一系列的操作进行初始化,而不希望每次实例化类的时候改变他,用静态构造函数比较方便。

public class MyClass
{
	static MyClass()
	{

	}
}

注意:静态构造函数没有访问修饰符,不能带任何参数,一个类只能有一个静态构造函数,只能访问类的静态成员(常量也是静态成员)他只是在第一次加载类的时候被调用。

C#中变量和常量点击打开链接

如下所示:下面一个类有一个只读属性Day(只有get,没有set) 和一个静态构造函数,在静态构造函数中初始化该属性,返回今天是周几。

public class StaticConstructor 
{

	// 只读属性(只有get没有set)
	public static  int Day{get;}
	static StaticConstructor()
	{
		// DateTime 是system下的一个类,用来处理与时间相关,这里的Now是DateTime类的静态属性,用于返回本机时间(与你设定的日期时间一致)
		DateTime now = DateTime.Now;
		// DayOfWeek 属性返回一个DayOfWeek枚举值(0-6 分别对应 周日到周六)
		Day = (int)now.DayOfWeek;
	}	
}

DateTime.Now 详细输出:点击打开链接

注意:静态构造函数与无参数的实例构造函数可以同时存在,尽管参数列表相同,但是静态构造函数是在第一次加载类的时候调用,而实例构造函数是在创建类的实例对象时调用,所以他们不会有冲突。



<think>我们正在讨论C#静态构造函数与私有构造函数的区别。首先,静态构造函数(staticconstructor)用于初始化类中的静态成员,它在类第一次被使用之前自动调用,且只调用一次。私有构造函数(privateconstructor)用于阻止类被实例化,通常用于工具类(只包含静态方法)或单例模式(确保只有一个实例)。下面我们详细解释两者的区别:1.静态构造函数:-使用static关键字定义,且不能有访问修饰符(如public、private),因为静态构造函数是系统自动调用的。-一个类只能有一个静态构造函数,不能带参数,也不能被直接调用。-在创建第一个实例或引用任何静态成员之前,运行时自动调用静态构造函数。2.私有构造函数:-使用private关键字定义,可以有参数(但通常无参)。-用于防止类被外部实例化。如果类中只有私有构造函数,那么外部代码不能使用new来创建实例。-常用于实现单例模式(通过一个公共的静态属性或方法来返回唯一的实例)或者工具类(所有成员都是静态的,不需要实例)。下面通过代码示例来说明:静态构造函数的示例: ```csharppublicclass MyClass{//静态字段public staticintMyStaticField;//静态构造函数static MyClass(){MyStaticField=100;Console.WriteLine("静态构造函数被调用");}//其他成员...} ```私有构造函数的示例(单例模式): ```csharppublicclass Singleton{//静态变量,用于保存唯一实例privatestatic Singletoninstance;//私有构造函数,防止外部使用new创建实例private Singleton(){}//公共静态方法,用于获取唯一实例public staticSingleton Instance{get{if(instance== null){instance =new Singleton();}return instance;}} }```私有构造函数的示例(工具类): ```csharppublicclass Utility{//私有构造函数,防止实例化privateUtility(){}//静态方法publicstatic voidDoSomething(){Console.WriteLine("这是一个工具类的方法");}} ```总结:-静态构造函数:用于初始化静态成员,自动调用,仅一次。-私有构造函数:用于控制实例化,如单例模式或工具类。现在,按照要求,在最后提出相关问题。§§相关问题§§:1.静态构造函数在什么时候会被调用?2.如果一个类同时包含静态构造函数和私有构造函数,它们各自的作用是什么?3.在单例模式中,如何确保线程安全?4.除了单例模式和工具类,私有构造函数还有哪些应用场景?</think>### C#静态构造函数与私有构造函数的区别 #### 静态构造函数 (Static Constructor) **作用**:初始化类的**静态成员**,在类首次被使用前自动执行一次 **特性**: - 使用 `static` 关键字声明 - 不能有访问修饰符或参数 - 自动触发(首次访问类时) - 线程安全(CLR 保证只执行一次) ```csharp public class Logger { // 静态字段 public static string LogDirectory; // 静态构造函数 static Logger() { LogDirectory = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyApp/Logs" ); Directory.CreateDirectory(LogDirectory); Console.WriteLine($"日志目录已初始化: {LogDirectory}"); } } ``` **使用场景**: ```csharp // 首次访问触发静态构造函数 Logger.LogDirectory; // 输出:日志目录已初始化: C:\Users\...\MyApp\Logs ``` --- #### 私有构造函数 (Private Constructor) **作用**:控制类的**实例化行为** **特性**: - 使用 `private` 访问修饰符 - 阻止外部直接实例化 - 常用于单例模式/工具类 ```csharp public class Singleton { // 静态实例 private static readonly Singleton _instance = new Singleton(); // 私有构造函数 private Singleton() { Console.WriteLine("单例实例已创建"); } // 公共访问点 public static Singleton Instance => _instance; } public static class MathUtils { // 私有构造函数阻止实例化 private MathUtils() { } public static int Add(int a, int b) => a + b; } ``` **使用场景**: ```csharp // 单例访问 Singleton obj = Singleton.Instance; // 输出:单例实例已创建 // 工具类调用 MathUtils.Add(5, 3); // ✅ 正常使用 // new MathUtils(); ❌ 编译错误(构造函数不可访问) ``` --- ### 核心区别总结 | **特性** | 静态构造函数 | 私有构造函数 | |------------------|----------------------------------|-----------------------------| | **关键字** | `static` | `private` | | **执行时机** | 类首次使用时(自动) | 通过特定机制调用(如单例) | | **目的** | 初始化静态成员 | 控制实例化权限 | | **调用方式** | 由 CLR 自动调用 | 需在类内部手动调用 | | **典型应用** | 全局配置/资源初始化 | 单例模式/工具类 | | **执行次数** | 整个应用生命周期仅一次 | 每次实例化时执行 | --- ### 关键注意事项 1. **静态构造函数**: - 如果初始化失败会抛出 `TypeInitializationException` - 不能在代码中显式调用 2. **私有构造函数**: - 可通过公共静态方法创建实例(工厂模式) - 子类继承时需注意可访问性(需使用 `protected`) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值