如何在C#中不创建对象执行类的静态构造函数(类比Java Class.forName)
C#中不创建对象触发静态构造函数的实现
嘿,作为C#新手能想到这个Java和C#的对比问题,挺细致的!答案是肯定的——C#里完全可以做到类似Java Class.forName() 的效果,不用创建实际对象就能触发类的静态构造函数。
先补全你提到的Java示例代码(方便对比)
import java.util.*; import java.lang.*; class MyClass { public static void main(String args[])throws ClassNotFoundException { // 通过Class.forName加载类,触发静态代码块 Class.forName("Student"); } } class Student { // Java的静态代码块 static { System.out.println("Student类的静态代码块执行了!"); } }
对应的C#实现方式
在C#中,静态构造函数会在类第一次被访问时自动执行,包括以下场景:
- 访问类的静态成员
- 使用
typeof获取类的Type对象 - 通过反射(比如
Type.GetType)加载类的Type对象
下面是和Java示例等价的C#代码:
using System; namespace StaticConstructorDemo { class Program { static void Main(string[] args) { // 方式1:通过反射获取类型,触发静态构造函数 // 注意要写完整的类型名(命名空间+类名) Type studentType = Type.GetType("StaticConstructorDemo.Student"); // 方式2:如果已经明确知道类,直接用typeof也能触发 // Type studentType = typeof(Student); } } class Student { // C#的静态构造函数,写法是static + 类名 static Student() { Console.WriteLine("Student类的静态构造函数执行了!"); } } }
额外说明
如果你的Student类在另一个独立的程序集(比如DLL文件)中,需要先加载程序集再获取类型,示例代码如下:
using System.Reflection; // 加载指定程序集 Assembly assembly = Assembly.LoadFrom("YourAssembly.dll"); // 获取完整类型名的Type对象,触发静态构造函数 Type studentType = assembly.GetType("YourNamespace.Student");
内容的提问来源于stack exchange,提问作者karun
相关产品推荐
相关产品推荐

