前言
C#中,构造函数和析构函数与C++的表现很不一样,从调用时机、修饰符等方面都有区别。C#中,构造函数可以由 public、private等修饰,而析构函数则不能有访问限制修饰符。构造函数和析构函数都没有返回值,析构函数没有参数。一个类只能有一个析构函数。而对于 struct, C#不允许程序员显示提供默认构造函数,编译器始终会提供一个默认构造函数,程序员只能定义带参数的构造函数。
构造函数
和C++一样,一旦程序员提供了一个非默认构造函数,编译器就不再提供默认构造函数,如果要使用默认构造函数的话,此时必须手动创建一个默认构造函数,编译器不会为程序自动创建。
对象初始化表达式
C# 3.0起允许在初始化时为 public 字段赋值。
public class A
{
public char a;
public char b;
public char c;
public static int S = 1;
public void f()
{
S = 2;
}
public A(int a)
{
}
}
public static void Main(string[] args)
{
int n = A.S;
A a;
a = new A(1) { a = 'a', b = 'b' };
}
表达式大括号里的内容 a = 'a' , b = 'b' 在调用构造函数后才执行。
静态构造函数
C#允许在类中定义一个 static 构造函数,而且这个函数必须没有任何参数,且不能用访问限制修饰符修饰(默认为 public)。
class A
{
public A() { }
public A(int n) { }
static A()
{
Console.Write("static A()");
}
}
public static void Main(string[] args)
{
A a = new A();
A b = new A();
}
上述代码打印
static A()
static 构造函数只在第一次使用该类(构建该类的一个实例)的时候调用,在程序的生命周期中,static 构造函数只会调用一次。
析构函数
析构函数用来释放资源,比如删除占有的资源,断开与数据库的连接等。在C#中,程序员无法显式调用析构函数。CLR(公共语言运行时)负责管理内存中的所有对象,并使用 GC 自动销毁无用的对象。通过静态类GC的Collect方法可以强制进行GC操作。
GC,Collect();