菜鸟谈谈C#中的构造函数和析构函数
本节说明对象的创建、初始化和销毁过程。本节介绍下列主题:
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#中的构造函数和析构函数的更多相关文章
- python中的构造函数和析构函数
python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...
- C++中的构造函数和析构函数
构造函数: 在类实例化对象时自动执行,对类中的数据进行初始化.构造函数可以从载,可以有多个,但是只能有一个缺省构造函数. 析构函数: 在撤销对象占用的内存之前,进行一些操作的函数.析构函数不能被重载, ...
- 005_python中的构造函数和析构函数
python中的特殊方法,其中两个,构造函数和析构函数的作用: 比说“__init__”这个构造函数,具有初始化的作用,也就是当该类被实例化的时候就会执行该函数.那么我们就可以把要先初始化的属性放到这 ...
- C# 中的构造函数与析构函数
C# 中的构造函数 类的 构造函数 是类的一个特殊的成员函数,当创建类的新对象时执行. 构造函数的名称与类的名称完全相同,它没有任何返回类型. 下面的实例说明了构造函数的概念: using Syste ...
- php中的构造函数与析构函数
PHP面向对象——构造函数.析构函数 __construct.__destruct__construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称, ...
- C++类继承中的构造函数和析构函数 调用顺序
思想: 在C++的类继承中,构造函数不能被继承(C11中可以被继承,但仅仅是写起来方便,不是真正的继承) 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时, ...
- 谈谈java中的构造函数
from 本篇博文主要是为新手.对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数 ...
- C++中的构造函数与析构函数及组合类的调用
// 构造函数与析构函数及类的组合 #include "stdafx.h"#include <iostream>using namespace std; //枚举enu ...
- (C++)C++类继承中的构造函数和析构函数
思想: 在C++的类继承中, 建立对象时,首先调用基类的构造函数,然后在调用下一个派生类的构造函数,依次类推: 析构对象时,其顺序正好与构造相反: 例子: #include <iostream& ...
随机推荐
- 【学习】js学习笔记:对象的遍历和封装特性
1.对象的属性访问: 对象.属性 对象[属性],但中括号中必须是字符串 2.属性的遍历: for in方法举例: var ren={}; ren.name="名字"; ren.ea ...
- GeoServer+PostgreSQL+PostGIS+pgRouting实现最短路径查询
一.软件安装 GeoServer下载地址: http://geoserver.org/download/ PostgreSQL下载地址: https://www.postgresql.org/down ...
- Extjs6(七)——增删查改之删除
本文基于ext-6.0.0 页面就是前面写的那个,有不清楚的可以看一下前面写页面那篇. 一.在toolbar加一个删除按钮 { text:'删除', iconCls:'x-fa fa-times', ...
- win10 uwp 如何让WebView标识win10手机
本文主要:如何让WebView访问的网页设别为手机,当然这句话我说不好,换个,如何让WebView设别为手机.上面两句话都是错的,因为是服务器识别,不是网页,第二句话应该是让服务器而不是WebView ...
- win10 & Ubuntu16 双系统安装
忽然心血来潮吧,本机在已经安装了win10的背景下,想要再加一个linux系统学习学习,几经波折,终于成功. 博主笔记本里有两块固态,一个250G的装了win10,装的时间不久,镜像是在msdn上下载 ...
- 线程queue
import queue q = queue.Queue() #模拟队列,先进先出 q.put('first') q.put('second') q.put('third') print(q.get( ...
- BZOJ-1045-[HAOI2008] 糖果传递(中位数原理)
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...
- 我的第一个python web开发框架(11)——工具函数包说明(二)
db_helper.py是数据库操作包,主要有两个函数,分别是read()数据库读操作函数和write()数据库写操作函数.这个包的代码是从小戴同学分享的博文改造过来的. #!/usr/bin/env ...
- LINUX 笔记-VIM常用命令整理
1.进入insert模式 o:当前行后 O:当前行前 r:替换当前字符 R:替换当前字符直到ESC 2.删除命令 #dw:删除#个word d^:删除至行尾 d$:删除至行首 3. u:撤消 ctrl ...
- mysql必知必会系列(一)
mysql必知必会系列是本人在读<mysql必知必会>中的笔记,方便自己以后查看. MySQL. Oracle以及Microsoft SQL Server等数据库是基于客户机-服务器的数据 ...