在C#中,类的执行顺序取决于你如何组织和调用代码。以下是类中代码执行的一般顺序:
-
静态构造函数:
-
如果类包含静态构造函数,它将在类首次被引用时执行,且仅执行一次。
-
静态构造函数常用于初始化静态成员。
-
-
实例构造函数:
-
当创建类的实例时,实例构造函数将被调用。
-
如果类继承自另一个类,将首先调用基类的构造函数(除非显式地调用
base()
)。
-
-
字段初始化:
-
类字段的初始化(包括自动属性的隐式字段)在构造函数执行之前进行。
-
-
构造函数体:
-
在字段初始化之后,构造函数体中的代码将被执行。
-
-
方法调用:
-
在对象创建后,可以调用其实例方法。
-
如果方法中包含对其他方法的调用,将按照调用顺序执行。
-
-
属性访问:
-
属性的getter和setter在访问属性值或赋值时执行。
-
-
索引器:
-
索引器在通过索引访问元素时执行。
-
-
析构函数:
-
当对象不再被引用,且垃圾回收器回收对象时,析构函数将被调用。
-
析构函数也称为终结器(Finalizer),它在对象被垃圾回收之前执行。
-
-
静态析构函数:
-
类的静态成员在应用程序域卸载时被清理,如果类包含静态析构函数,它将在静态成员被清理前执行。
-
在实际应用程序中,代码的执行顺序通常由程序的入口点(如 Main
方法)决定,然后按照方法调用和对象创建的顺序进行。例如:
class MyClass
{
static MyClass()
{
// 静态构造函数,类首次被引用时执行
}
MyClass()
{
// 实例构造函数,创建对象时执行
}
~MyClass()
{
// 析构函数,对象被垃圾回收时执行
}
void MyMethod()
{
// 实例方法,调用时执行
}
public int MyProperty { get; set; } // 属性访问
public int this[int index] { get; set; } // 索引器访问
}
class Program
{
static void Main(string[] args)
{
MyClass myObject = new MyClass(); // 构造函数
myObject.MyMethod(); // 方法调用
var value = myObject.MyProperty; // 属性访问
var indexedValue = myObject[0]; // 索引器访问
}
}
在这个例子中,MyClass
的静态构造函数首先被执行,然后是实例构造函数,接着是方法调用、属性访问和索引器访问。最后,当 myObject
不再被引用时,它的析构函数将被执行。如果 MyClass
包含静态成员,那么静态析构函数将在应用程序域卸载时执行。