文章目录

  • 静态类
  • 实例构造函数
  • 构造函数的执行顺序
  • 破坏者

有两种特殊的方法。如果名称是固定的,则构造函数必须与类名相同,析构函数名称为“~”,后跟类型名称。

创建对象的新实例通常伴随着实例构造函数的自动调用。

值类型在创建时总是被实例化的,所以它们不需要构造函数。

静态类

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控制它的执行时间,所以我们不能直接调用它。

发表评论

后才能评论