文章目录
- 静态类
- 实例构造函数
- 构造函数的执行顺序
- 破坏者
有两种特殊的方法。如果名称是固定的,则构造函数必须与类名相同,析构函数名称为“~”,后跟类型名称。
创建对象的新实例通常伴随着实例构造函数的自动调用。
值类型在创建时总是被实例化的,所以它们不需要构造函数。
静态类
Console是一个静态类。当我们想把一个类做成工具类的时候,可以考虑使用静态类。
该类将被频繁使用。如果不是静态的,每次使用时都需要在堆上分配空。如果是静态的,只需要分配一次空,然后类就会一直驻留在负载堆上,省时省力。
Static关键字只能在类中使用,不能在结构中使用。
类型的静态成员是全局的。如果该类型有多个实例,共享静态成员,也就是说,一个实例更改了静态变量的值,所有其他实例都会受到影响。静态类和实例类的静态成员驻留在加载堆中,不受GC控制。
静态类中的所有方法都必须是静态方法,所有成员都必须是静态成员。
类的静态使用不需要创建新的实例。
实例构造函数
被引用类型的实例构造函数不能被继承,但父类的构造函数可以通过base调用。
对于静态字段,静态构造函数负责。因为静态成员在实例构造函数中被赋值,然后该值被更改并创建新的实例,所以该值被实例构造函数改回。通常,静态成员只在静态构造函数中赋值(因为它只会执行一次)
如果该类型没有定义构造函数,将生成不带参数的实例构造函数。
您可以声明多个不同的构造函数,并使用该关键字调用其他构造函数。
class Program { static void Main(string[] args) { AClass a = new AClass(); Console.WriteLine(a.i); AClass b = new AClass(10); Console.WriteLine(b.i); Console.ReadKey(); // 静态构造函数 // 有参数的构造函数 // 实例构造函数 // 5 // 有参数的构造函数 // 10 } } public class AClass { public int i; public static int j; static AClass() { j = 2; Console.WriteLine(\”静态构造函数\”); } public AClass() : this(5) { Console.WriteLine(\”实例构造函数\”); } public AClass(int i) { this.i = i; Console.WriteLine(\”有参数的构造函数\”); } }
创建A时,调用不带参数的构造函数,而不带参数的构造函数调用带参数的构造函数,所以先执行带参数的构造函数,将I设为5,再执行不带参数的构造函数。创建B时,只调用了带参数的构造函数。
构造函数的执行顺序
如果有一个父类和继承它的子类
执行静态构造函数(子类先于父类)。如果已经执行了父类或子类的静态构造函数,就不会再执行了。
执行实例构造函数(第一个父类后面跟着子类)。如果有这个,先调用这个之后指向的实例构造函数的重载,然后执行你自己的。
如果父类的构造函数是私有的,则不能编译子类的构造函数。子类的实例构造函数调用父类的实例构造函数。
破坏者
将在对象被垃圾回收时执行,没有参数也没有返回值。
GC控制它的执行时间,所以我们不能直接调用它。