c#

位置:IT落伍者 >> c# >> 浏览文章

C#中构造函数和析构函数的用法(三)


发布日期:2023年02月26日
 
C#中构造函数和析构函数的用法(三)

B b = new B(); //执行基类A的构造函数A()再执行派生类的构造函数B()

B b = new B(); //执行基类A的构造函数A()再执行派生类的构造函数B(int)

B b = new B(); //执行执行基类A的构造函数A(int) 再执行派生类的

构造函数B(intint)

在这里构造函数的执行次序是一定要分析清楚的另外如果基类A中没有提供无参构造函数public A( ) { x = ; }则在派生类的所有构造函数成员初始化表中必须指出基类A的有参构造函数A(i)如下所示

class A

{

private int x;

public A( int i ) { x = i; }

};

class B : A

{

private int y;

public B():A(i) { y = ; }

public B(int i):A(i) { y = i; }

public B(int i int j):A(i) { y = j; }

};

三.析构函数和垃圾回收器在C#中的运用

析构函数是实现销毁一个类的实例的方法成员析构函数不能有参数不能任何修饰符而且不能被调用由于析构函数的目的与构造函数的相反就加前缀~以示区别

虽然C#(更确切的说是CLR)提供了一种新的内存管理机制自动内存管理机制(Automatic memory management)资源的释放是可以通过垃圾回收器 自动完成的一般不需要用户干预但在有些特殊情况下还是需要用到析构函数的如在C#中非托管资源的释放

资源的释放一般是通过垃圾回收器自动完成的但具体来说仍有些需要注意的地方

值类型和引用类型的引用其实是不需要什么垃圾回收器来释放内存的因为当它们出了作用域后会自动释放所占内存因为它们都保存在栈(Stack)中;

只有引用类型的引用所指向的对象实例才保存在堆(Heap)中而堆因为是一个自由存储空间所以它并没有像那样有生存期(的元素弹出后就代表生存期结束也就代表释放了内存)并且要注意的是垃圾回收器只对这块区域起作用;

然而有些情况下当需要释放非托管资源时就必须通过写代码的方式来解决通常是使用析构函数释放非托管资源将用户自己编写的释放非托管资源的代码段放在析构函数中即可需要注意的是如果一个类中没有使用到非托管资源那么一定不要定义析构函数这是因为对象执行了析构函数那么垃圾回收器在释放托管资源之前要先调用析构函数然后第二次才真正释放托管资源这样一来两次删除动作的花销比一次大多的下面使用一段代码来示析构函数是如何使用的

public class ResourceHolder

{

~ResourceHolder()

{

// 这里是清理非托管资源的用户代码段

}

}

四.小结

构造函数与析构函数虽然是一个类中形式上较简单的函数但它们的使用决非看上去那么简单因此灵活而正确的使用构造函数与析构函数能够帮你更好的理解CLR的内存管理机制以及更好的管理系统中的资源

上一篇:使用.NET Framework中新的日期时间类型[7]

下一篇:C# 制作以动画的方式显示图像[1]