当前位置:编程学习 > C#/ASP.NET >>

C#编程学习

构造函数与析构函数的区别??
答案:
构造函数和析构函数不是通过继承得到的,但是不管是基类的组件还是派生类的组件都需要进行初始化。一个对象的基类组件负责对基类成员进行初始化,而派生类组件负责对派生类成员进行初始化。派生类组件和基类组件的构造函数就是因为这个原因被调用的。因为构造函数是不可继承的,派生类型必须实现本地化的构造函数以对派生成员进行初始化。

在对一个派生类型进行实例化的过程中,默认调用的是默认的或无参数的基类型实例的构造函数。如果基类没有默认的构造函数,将会产生一个编译错误,除非派生类调用了基类的有一个参数的构造函数。在以下代码中,ZClass类没有默认的构造函数,因而不能编译。

public class ZClass {

public ZClass(int param) {

}

}

public class YClass: ZClass {

}

在一个派生类中的构造函数可以显式调用基类的构造函数。这对于调用基类参数化的构造函数尤其有用。基类的构造函数被派生类采用一个构造函数初始值设定项列表来调用。初始值设定项列表只能附加在派生类的实例构造函数上。派生的构造函数负责对派生类型进行初始化,并且可能调用基类的构造函数。

构造函数初始值设定项的语法是:

accessibility modifier typename(parameterlist 1) : base(parameterlist 2)

{constructorbody}

构造函数初始值设定项列表紧跟在被派生的构造函数和冒号之后。base关键字指向基类的构造函数。“parameterlist 2”确定哪一个基类的构造函数被调用。被派生的构造函数的参数可以用在基类构造函数的参数列表中。

在以下例子中,YClass类的构造函数显式地调用基类的单参数的构造函数。

public class ZClass {

public ZClass(int param) {

}

}

public class YClass: ZClass {

public YClass(int param) : base(param) {

}

}

派生类型的实例从里到外地创建。首先创建基组件,然后是派生组件。为了支持这样的模式,构造函数自下而上地执行,这便于从派生构造函数向基构造函数传递参数。参数在类层次结构中从下往上传递之后,所有构造函数从根类的构造函数开始自上而下地执行。

以下代码证实了构造函数初始值设定项自下而上地调用,而构造函数从基类的构造函数开始自上而下地调用。

using System;

namespace Donis.CSharpBook{

public class Starter{

public static void Main(){

XClass ōbj=new XClass();

}

}

public class ZClass {

public ZClass(int param) {

Console.WriteLine("ZClass constructor");

}

}

public class YClass: ZClass {

public YClass(int param) : base(YClass.MethodA()) {

Console.WriteLine("YClass constructor");

}

public static int MethodA() {

Console.WriteLine("YClass constructor initializer");

return 0;

}

}

public class XClass: YClass {

public XClass() : base(XClass.MethodA()) {

Console.WriteLine("XClass constructor");

}

public static new int MethodA() {

Console.WriteLine("XClass constructor initializer");

return 0;

}

}

}

以下是代码输出的结果,证明了基类的构造函数初始值设定项的先后顺序以及构造函数的实际调用。

C:\>insideout

XClass constructor initializer

YClass constructor initializer

ZClass constructor

YClass constructor

XClass constructor

对象直到构造函数执行完毕之后才完全创建。因此,派生类型的this引用不能在构造函数初始值设定项列表中用作参数。

public class ZClass {

public ZClass(YClass obj) {

}

}

public class YClass: ZClass {

public YClass() : base(this) { // Illegal

}

}

析构函数的调用顺序与构造函数相反。派生对象从里到外地被清理,最后派生的组件最先被清理。相对地,析构函数被自下而上地调用。因为析构函数都是无参数的,所以没有信息在它们之间进行传递。在C#中,基类的析构函数被自动调用,不要试图显式地调用基类的析构函数。

以下代码包括三个类,每个类都有一个析构函数,构成了一个类层次结构。在程序的末尾,析构函数被自下而上地调用,这证实了析构函数执行的先后顺序。

using System;

namespace Donis.CSharpBook{

public class Starter{

public static void Main(){

XClass ōbj=new XClass();

}

}

public class ZClass {

~ZClass() {

Console.WriteLine("ZClass destructor");

}

}

public class YClass: ZClass {

~YClass() {

Console.WriteLine("YClass destructor");

}

}

public class XClass: YClass {

~XClass() {

Console.WriteLine("XClass destructor");

}

}

}

以下是程序的输出结果:

C:\>destructors

XClass destructor

YClass destructor

ZClass destructor
析构函数用来释放对象所分配的资源的
构造函数是创建类的对象的,从而用来进行对象的实例化
简单的莱说.构造函数是在类被实例化来分配内存资源的
析构函数就是回收内存资源的

上一个:vb编程里面那个按不到的按钮是怎么做到的?
下一个:有关C#问题请教

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,