类构造函数 本节将讨论三种类构造函数 类构造函数的类型 注释 实例 用于创建并初始化类的实例 私有 在类之外不可访问的特殊类型实例构造函数无法用私有构造函数来实例化类 静态 在创建第一个实例或引用任何静态成员之前将自动调用这种构造函数来初始化类无法直接调用这种构造函数 备注 () 实例构造函数 创建新对象时将调用类构造函数例如 Point myPoint = new Point(); 一个类可以有多个构造函数例如可以声明一个不带参数的构造函数(如 Point())和一个带参数的构造函数(如 Point(int x int y)) 如果类没有构造函数将自动生成一个默认的无参数构造函数并使用默认值初始化对象字段(例如int 将初始化为 ) 类构造函数可通过base关键字来调用基类的构造函数例如 public Cylinder(double radius double height): base(radius height) { } 类构造函数也可通过关键字 this 调用同一个类的另一个构造函数例如 public Point(): this() { } 在前面的示例中无参数构造函数 Point() 调用了另一个带有两个参数的构造函数将默认位置初始化为 ( ) ()私有构造函数 私有构造函数是一种特殊的实例构造函数它通常用在只包含静态成员的类中如果类具有一个或多个私有构造函数而没有公共构造函数则不允许其他类(除了嵌套类)创建该类的实例例如 class NLog { // Private Constructor: private NLog() {} public static double e = ; } 声明空构造函数可阻止自动生成默认构造函数注意如果您不对构造函数使用访问修饰符则在默认情况下它仍为私有构造函数但是通常显式地使用 private(私有)修饰符来清楚地表明该类不能被实例化 ()静态构造函数 静态构造函数用于初始化类在创建第一个实例或引用任何静态成员之前将自动调用静态构造函数来初始化类 静态构造函数既没有访问修饰符也没有参数 在创建第一个实例或引用任何静态成员之前(方法或字段)将自动调用静态构造函数来初始化类 无法直接调用静态构造函数静态构造函数也不能访问非静态成员它只被调用一次 在程序中用户无法控制何时执行静态构造函数 静态构造函数的典型用途是当类使用日志文件时将使用这种构造函数向日志文件中写入项 结构构造函数 结构构造函数类似于类构造函数只是存在以下差异 n 结构不能包含显式的无参数构造函数结构成员将自动初始化为它们的默认值 n 结构不能有以下形式的初始值设定项base (argumentlist) 结构可以声明构造函数但它们必须带参数声明结构的默认(无参数)构造函数是错误的结构成员不能有初始值设定项总是提供默认构造函数以将结构成员初始化为它们的默认值 对于结构不像类那样存在继承一个结构不能从另一个结构或类继承结构不能有以下形式的初始值设定项base (argumentlist) 析构函数 析构函数用于销毁类的实例 备注 不能对结构使用析构函数只能对类使用析构函数 一个类只能有一个析构函数 无法继承或重载析构函数 无法调用析构函数它们是被自动调用的 析构函数既没有修饰符也没有参数例如下面是类 MyClass 的析构函数的声明 ~ MyClass() { // Cleanup statements } 该析构函数隐式地对对象的基类调用 ObjectFinalize 方法这样前面的析构函数代码被隐式地转换为 protected override void Finalize() { try { // Cleanup statements } finally { baseFinalize(); } } 这意味着对继承链中的所有实例递归地(从派生相近程度最大的到派生相近程度最小的)调用 Finalize 方法 程序员无法控制何时调用析构函数因为这由垃圾回收器决定的垃圾回收器检查是否存在应用程序不再使用的对象它认为这些对象符合销毁条件并回收这些对象占用的内存程序退出时也会调用析构函数 base关键字 base 关键字用于从派生类中访问基类的成员 调用基类上已被其他方法重写或隐藏的方法 指定创建派生类实例时应调用的基类构造函数 基类访问只能在构造函数实例方法或实例属性访问器中进行 静态方法中使用 base 关键字是错误的 This 关键字 this 关键字表示类的当前实例 静态成员没有 this 指针 访问被相同的名称隐藏的成员 如 public Employee(string name string alias) { thisname = name; thisalias = alias; } 将this作为参数传递到其他方法 如 CalcTax(this); 声明索引器例如 public int this [int param] { get { return array[param]; } set { array[param] = value; } } 调用同类中其它的构造函数 静态方法静态属性访问器引用 this 是错误的 |