C# 高级编程 - 释放资源

C# 高级编程 - 释放资源

Dispose方式

微软为非托管资源的回收专门定义了一个接口:IDisposable,接口中只能包含一个Dispose()方法.任何包含非托管资源的类,都应该继承此接口。

在一个包含非托管资源的类中,关于资源释放的标准做法是:

  1. 继承IDisposeable接口;
  2. 事项Dispose()方法,在其中释放托管资源和非托管资源,并将对象本身从垃圾回收器中移除(垃圾回收器不在回收此资源);
  3. 实现类析构函数,在其中释放非托管资源

显示调用Dispose()方法,可以及时的释放资源, 如果没有显示调用Dispose()方法,垃圾回收器也可以通过析构函数来释放非托管资源,只不过由垃圾回收器回收会导致非托管资源的未能及时释放

注: 在.net中应该尽可能的少使用析构函数释放资源, 最好及时的调用Dispose()方法来回收资源,而不是依赖垃圾回收器

问题:通过Dispose进行资源的释放也是有潜在的风险的, 如果代码中漏掉了Dispose的调用或者在Dispose调用之前产生了异常从而没有指定Dispose,那么有些资源可能就一直留在内存中了

解决:可以用try/finally 来保证dispose一定会调用, 但是每个地方都这么写有些麻烦,using语句提供了一个高效的调用对象Dispose方法的方式.对于任何IDisposable接口的类型,都可以使用using语句,在using语句块结束的时候,mr实例的Dispose方法会被自动调用,事实上,C#编译器为using语句自动添加了try/finally语句块

Finalize方式

释放非托管资源除了dispose,还有重写Finalize方法,就是上面提到的第三步,为什么是析构函数呢?因为Finalize方法不能被直接重写,只能通过这个方式才能重写它。

而且最重要的原因是C#编译器会为Finalize方法隐式的加入一些必要的基础代码,这些代码就是保证finalize方法总是能被执行。

注: Finalize方法的调是相当耗费资源的,如果创建了一个不使用非托管资源的类型,实现终结器是没有任何作用的,所以,如果没有特殊的需要应该避免重写Finalize方法。

Finalize与Dispose结合使用

Dispose和Finalize的结合,保证非托管资源的回收。

public class MyResourceWrapper : IDisposable
{
    private bool IsDisposed = false;
    ~MyResourceWrapper()
    {
        Dispose(false);
    }
    public void Dispose(bool disposing)
    {
        if (!this.IsDisposed)
        {
            if (disposing)
            {
                //清除托管资源
            }
            //清除非托管资源
        }
        this.IsDisposed = true;
    }
    public void Dispose()
    {
        Dispose(true);
        //告诉GC不调用Finalize方法
        GC.SuppressFinalize(this);
    }
}

优点:

  1. 如果没有显式的调用Dispose(),未释放托管和非托管资源,那么在垃圾回收时,还会执行Finalize,释放非托管资源,同时GC会释放托管资源.
  2. 如果调用了Dispose(),就能及时释放托管和非托管资源,那么该对象被垃圾回收时,就不会执行Finalize(),提高了非托管资源的使用效率并提升了系统性能

http://blog.csdn.net/shanyongxu/article/details/47321007

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 语言编写程序时,需要注意哪些问题? 在使用C语言编写程序时,需要注意以下几个问题: 1. 语法规范:C语言有自己的语法规范,需要按照规范编写代码,否则会出现编译错误。 2. 变量命名:变量命名需要具有一定的意义,方便代码的阅读和维护。 3. 内存管理:C语言需要手动管理内存,需要注意内存的分配和释放,避免内存泄漏和野指针等问题。 4. 安全性:C语言容易出现缓冲区溢出等安全问题,需要注意代码的安全性。 5. 代码风格:编写代码时需要注意代码风格的统一性,方便团队协作和代码维护。 ### 回答2: C语言是一种通用的高级编程语言,最初由美国计算机科学家丹尼斯·里奇在20世纪70年代初期于贝尔实验室开发。它是一种基于过程的编程语言,被广泛用于系统软件开发,尤其是操作系统和嵌入式系统的开发。 C语言的特点之一是它的简洁性和灵活性。它提供了一些基本的数据类型和操作符,并支持函数的定义和调用,允许程序员按照自己的需求进行编程。C语言的语法相对简单,易于学习和理解,同时也具有高效的执行速度和占用较少的内存空间。 C语言的另一个重要特点是它的移植性。由于C语言编写的程序可以直接转化为机器语言执行,因此可以在不同的计算机平台上运行。这使得C语言成为了开发跨平台软件的首选语言。许多操作系统和编译器都是用C语言编写的。 C语言还有丰富的标准库和第三方库支持,这些库提供了许多常用的函数和数据结构,方便程序员进行开发。同时,C语言也支持指针操作,使得程序员可以直接访问内存,对数据进行更加灵活和高效的处理。 总结来说,C语言是一种功能强大且广泛应用的编程语言。它的简洁性、灵活性和移植性使得它成为了许多领域的首选语言,特别是在系统软件和嵌入式系统的开发中。同时,它也具有丰富的库支持和指针操作等特性,为程序员提供了更多的开发可能性。无论是初学者还是专业程序员,学习和掌握C语言都是常有价值的。 ### 回答3: C语言是一种通用的高级程序设计语言,它由美国计算机科学家丹尼斯·里奇在20世纪70年代初开发。C语言具有许多优点,因此在软件开发领域广泛应用。 首先,C语言简单易学,语法结构清晰,易于理解和编写。它的语法规则简洁明了,没有过多的特殊符号和复杂的概念,使得初学者能够快速入门,并能够从基本的打印输出、变量声明、条件语句等开始编写简单的程序。 其次,C语言具有高效性。它可以直接访问计算机的底层硬件,能够更好地利用计算机的资源和性能。C语言提供了丰富的内置函数和库,可以进行底层操作,如内存管理、指针运算等,使程序的执行效率更高,特别适用于对性能要求较高的软件开发。 此外,C语言具有良好的可移植性。由于C语言是常通用的语言,可以在不同的操作系统和硬件平台上编写和运行。只需稍作修改,就能够适应不同环境的需求,因此C语言编写的程序可以在多个平台上运行,提高了软件的可移植性和跨平台兼容性。 最后,C语言还具有广泛的应用领域。几乎所有的操作系统、嵌入式系统和大型应用软件中都使用C语言开发。例如,UNIX操作系统、Linux操作系统以及许多常用的开源软件,如MySQL、Mozilla Firefox等都是用C语言编写的。C语言在编程领域拥有庞大的生态系统和强大的支持,为开发人员提供了丰富的资源和工具。 总而言之,C语言简单、高效、可移植且广泛应用。掌握C语言可以帮助我们更好地理解和编写程序,为我们在软件开发领域取得成功提供了强有力的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值