本节说明对象的创建、初始化和销毁过程。本节介绍下列主题:

l         类构造函数

l         结构构造函数

l         析构函数

类构造函数

本节将讨论三种类构造函数:

类构造函数的类型

注释

实例

用于创建并初始化类的实例。

私有

在类之外不可访问的特殊类型实例构造函数。无法用私有构造函数来实例化类。

静态

在创建第一个实例或引用任何静态成员之前,将自动调用这种构造函数来初始化类。无法直接调用这种构造函数。

备注

       (1) 实例构造函数

创建新对象时将调用类构造函数,例如:

Point myPoint = new Point();

一个类可以有多个构造函数。例如,可以声明一个不带参数的构造函数(如 Point())和一个带参数的构造函数(如 Point(int x, int y))。

如果类没有构造函数,将自动生成一个默认的无参数构造函数,并使用默认值初始化对象字段(例如,int 将初始化为 0)。

类构造函数可通过base关键字来调用基类的构造函数,例如:

public Cylinder(double radius, double height): base(radius, height)

{

}

类构造函数也可通过关键字 this 调用同一个类的另一个构造函数,例如:

public Point(): this(0,20)

{

}

在前面的示例中,无参数构造函数 Point() 调用了另一个带有两个参数的构造函数,将默认位置初始化为 (0, 20)。

(2)私有构造函数

私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则不允许其他类(除了嵌套类)创建该类的实例。例如:

class NLog

{

// Private Constructor:

private NLog() {}

public static double e = 2.71828;

}

声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问修饰符,则在默认情况下它仍为私有构造函数。但是,通常显式地使用 private(私有)修饰符来清楚地表明该类不能被实例化。

(3)静态构造函数

静态构造函数用于初始化类。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。

静态构造函数既没有访问修饰符,也没有参数。

在创建第一个实例或引用任何静态成员之前(方法或字段),将自动调用静态构造函数来初始化类。

无法直接调用静态构造函数。静态构造函数也不能访问非静态成员,它只被调用一次

在程序中,用户无法控制何时执行静态构造函数。

静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。

结构构造函数

结构构造函数类似于类构造函数,只是存在以下差异:

n         结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。

n         结构不能有以下形式的初始值设定项:base (argument-list)。

结构可以声明构造函数,但它们必须带参数。声明结构的默认(无参数)构造函数是错误的。结构成员不能有初始值设定项。总是提供默认构造函数以将结构成员初始化为它们的默认值。

对于结构,不像类那样存在继承。一个结构不能从另一个结构或类继承。结构不能有以下形式的初始值设定项:base (argument-list)。

析构函数

析构函数用于销毁类的实例。

备注

不能对结构使用析构函数。只能对类使用析构函数。

一个类只能有一个析构函数。

无法继承或重载析构函数。

无法调用析构函数。它们是被自动调用的。

析构函数既没有修饰符,也没有参数。例如,下面是类 MyClass 的析构函数的声明:

~ MyClass()

{

// Cleanup statements.

}

该析构函数隐式地对对象的基类调用 Object.Finalize 方法。这样,前面的析构函数代码被隐式地转换为:

protected override void Finalize()

{

try

{

// Cleanup statements.

}

finally

{

base.Finalize();

}

}

这意味着对继承链中的所有实例递归地(从派生相近程度最大的到派生相近程度最小的)调用 Finalize 方法。

程序员无法控制何时调用析构函数,因为这由垃圾回收器决定的。垃圾回收器检查是否存在应用程序不再使用的对象。它认为这些对象符合销毁条件并回收这些对象占用的内存。程序退出时也会调用析构函数。

base关键字

base 关键字用于从派生类中访问基类的成员:

调用基类上已被其他方法重写或隐藏的方法。

指定创建派生类实例时应调用的基类构造函数。

基类访问只能在构造函数、实例方法或实例属性访问器中进行。

静态方法中使用 base 关键字是错误的。

This 关键字

this 关键字表示类的当前实例。

静态成员没有 this 指针。

访问被相同的名称隐藏的成员。

如:

public Employee(string name, string alias)

{

this.name = name;

this.alias = alias;

}

将this作为参数传递到其他方法。

如:

CalcTax(this);

声明索引器,例如:

public int this [int param]

{

get

{

return array[param];

}

set

{

array[param] = value;

}

}

调用同类中其它的构造函数

静态方法、静态属性访问器引用 this 是错误的。

菜鸟谈谈C#中的构造函数和析构函数的更多相关文章

  1. python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  2. C++中的构造函数和析构函数

    构造函数: 在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数: 在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载, ...

  3. 005_python中的构造函数和析构函数

    python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...

  4. C# 中的构造函数与析构函数

    C# 中的构造函数 类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行. 构造函数的名称与类的名称完全相同,它没有任何返回类型. 下面的实例说明了构造函数的概念: using Syste ...

  5. php中的构造函数与析构函数

    PHP面向对象——构造函数.析构函数 __construct.__destruct__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称, ...

  6. C++类继承中的构造函数和析构函数 调用顺序

    思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...

  7. 谈谈java中的构造函数

    from 本篇博文主要是为新手.对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数 ...

  8. C++中的构造函数与析构函数及组合类的调用

    // 构造函数与析构函数及类的组合 #include "stdafx.h"#include <iostream>using namespace std; //枚举enu ...

  9. (C++)C++类继承中的构造函数和析构函数

    思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...

随机推荐

  1. 从头编写 asp.net core 2.0 web api 基础框架 (2)

    上一篇是: http://www.cnblogs.com/cgzl/p/7637250.html Github源码地址是: https://github.com/solenovex/Building- ...

  2. hadoop streaming编程小demo(python版)

    大数据团队搞数据质量评测.自动化质检和监控平台是用django,MR也是通过python实现的.(后来发现有orc压缩问题,python不知道怎么解决,正在改成java版本) 这里展示一个python ...

  3. Win10下python3和python2同时安装并解决pip共存问题

    特别说明,本文是在Windows64位系统下进行的,32位系统请下载相应版本的安装包,安装方法类似. 使用python开发,环境有Python2和 python3 两种,有时候需要两种环境切换使用,下 ...

  4. PHP Server Nginx 安装

    1. PHP 安装: http://jingyan.baidu.com/article/b2c186c8f16d05c46ef6ff3c.html PHP 问题: http://www.cnblogs ...

  5. 张高兴的 Windows 10 IoT 开发笔记:ToF Sensor VL53L0X

    GitHub : https://github.com/ZhangGaoxing/windows-iot-demo/tree/master/VL53L0X

  6. 简述Apache的ab测试主要有那些关键指标

    一.ab的原理 ab是apachebench命令的缩写. ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问.它的测试目标是基于URL的,因此,它既可以用来测试ap ...

  7. Prometheus 到底 NB 在哪里?- 每天5分钟玩转 Docker 容器技术(84)

    本节讨论 Prometheus 的核心,多维数据模型.我们先来看一个例子. 比如要监控容器 webapp1 的内存使用情况,最传统和典型的方法是定义一个指标 container_memory_usag ...

  8. Spring bean 生命周期验证

    一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...

  9. C++const使用(06)

    可以在类中使用const关键字定义数据成员和成员函数或修饰一个对象.一个const对象只能访问const成员函数,否则将产生编译错误. 常量成员 常量成员包括常量数据成员.静态常数据成员和常引用.静态 ...

  10. 实验之-----------修改oracle实例名

    --查询当前数据库实例名称: SQL> select instance_name,status from v$instance; INSTANCE_NAME STATUS------------ ...