iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#实现IDisposable接口释放非托管资源
  • 734
分享到

C#实现IDisposable接口释放非托管资源

2024-04-02 19:04:59 734人浏览 泡泡鱼
摘要

目录完整示例为什么要实现Foo析构函数Dispose方法中为什么要调用GC.SuppressFinalizeReference Why using finalizers is a b

Reference

Why using finalizers is a bad idea

当在一个类中使用了另外一个实现了IDisposable的类作为一个成员属性时, 此时这个类就有必要也去实现IDisposable接口, 以确保在合适的实际释放非托管资源, 到底该如何正确的实现这个接口呢? 当然这只是需要实现IDisposable接口其中一种情况

完整示例

示例的Foo类中包含了一个Stream类型的_stream成员, 因此需要为Foo类实现IDisposable模式

public class Foo : IDisposable
{
    private bool _disposed;
    private readonly Stream? _stream;
    public Foo()
    {
        _stream = File.Create("1.txt", 2048);
    }
    ~Foo()
    {
        CleanupUnmanagedResources();
    }
    private void CleanupUnmanagedResources()
    {
        if (_disposed) return;
        // 释放非托管资源
        _stream?.Dispose();
        _disposed = true;
    }
    public void Dispose()
    {
        CleanupUnmanagedResources();
        GC.SuppressFinalize(this);
    }
}

为什么要实现Foo析构函数

因为人性的弱点(?)

哈哈, 其实因为我们在使用Foo时可能会忘记手动调用其Dispose方法, 这个时候如果没有析构函数的话, 很可能导致资源永远得不到释放最终酿成内存泄漏的惨剧.

当然啦, 在析构函数中释放非托管资源可能会给GC带来额外的开销, 所以最好的做法是依然是使用using块保证能够及时的调用Dispose方法, 这里使用析构函数只是为了防止意外的发生. 至于为什么说在析构函数中释放非托管资源会导致额外的GC开销呢, 这涉及到GC回收过程,GC在处理包含析构函数的类时不会立即将此类回收, 而是会被GC标记为下一代, 这样这个被标记为下一代的类只有在GC决定回收下一代的垃圾对象时, 才会被真正回收掉, 这样一来就会导致额外的内存和性能开销了.

Dispose方法中为什么要调用GC.SuppressFinalize

GC.SuppressFinalize方法可以告诉GC不需要在调用此类的析构函数(Finalizers)了;

因为在Foo类的析构函数中调用了Foo.CleanupUnmanagedResources方法, 当GC回收此类调用此类析构函数时, 有可能会导致两次调用Foo.CleanupUnmanagedResources(第一次是Dispose方法中调用的)导致额外的开销,

所以当我们手动调用了Foo.Dispose(通过是通过using语法糖)后, 就需要告诉GC, "你回收我的时候用不着调用我的析构函数了, 该释放的资源我早就释放掉了已经", 转换成代码就是GC.SuppressFinalize

以上就是C#实现IDisposable接口释放非托管资源的详细内容,更多关于C# IDisposable接口释放资源的资料请关注编程网其它相关文章!

--结束END--

本文标题: C#实现IDisposable接口释放非托管资源

本文链接: https://www.lsjlt.com/news/148882.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C#实现IDisposable接口释放非托管资源
    目录完整示例为什么要实现Foo析构函数Dispose方法中为什么要调用GC.SuppressFinalizeReference Why using finalizers is a b...
    99+
    2024-04-02
  • C#怎么实现IDisposable接口释放非托管资源
    这篇文章主要介绍了C#怎么实现IDisposable接口释放非托管资源的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么实现IDisposable接口释放非托管资源文章都会有所收获,下面我们一起来看看吧。当...
    99+
    2023-06-30
  • C#中如何释放非托管资源
    这篇文章主要介绍“C#中如何释放非托管资源”,在日常操作中,相信很多人在C#中如何释放非托管资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中如何释放非托管资源”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-18
  • C#中怎么释放托管资源
    这期内容当中小编将会给大家带来有关C#中怎么释放托管资源,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源&qu...
    99+
    2023-06-17
  • C#加载嵌入到资源的非托管dll
    如何加载非托管Dll 我们总会遇到需要加载非Win32的非托管dll,这里推荐一种方式就是将那些非win32的非托管dll嵌入资源的方式,在入口解压并且加载的方式,我先来看看如何实现...
    99+
    2024-04-02
  • c#非托管内存的释放问题如何解决
    这篇“c#非托管内存的释放问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c#非托管内存的释放问题如何解决”文章吧...
    99+
    2023-07-05
  • c#关于非托管内存的释放问题及解读
    目录关于非托管内存的释放问题托管内存与非托管内存之间的转换1.managed memory-> unmanaged memory2.un-managed memory->...
    99+
    2023-02-26
    c#非托管内存 非托管内存的释放 c#非托管
  • C#中怎么实现一个IDisposable接口
    这期内容当中小编将会给大家带来有关C#中怎么实现一个IDisposable接口,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。C#语言有很多值得学习的地方,这里我们主要介绍C#实现IDisposable接口...
    99+
    2023-06-17
  • C++ 函数异常与资源管理:释放内存的正确姿势
    在 c++++ 中,通过适当的异常处理和资源管理,可以安全有效地释放内存和管理资源:异常处理:try-catch 块用于捕获和处理异常,并释放获取的资源以防止内存泄漏。资源管理:std:...
    99+
    2024-05-03
    c++ 内存管理 异常处理
  • C#(.Net)将非托管dll嵌入exe中的实现
    目录托管dll与非托管dll下载与安装添加Dll调用编译托管dll与非托管dll 托管dll实际上是指C#编写的dll,可以直接右键“引用”导入 而大部分情况下,我们需要引用C++写...
    99+
    2024-04-02
  • Python嵌入C/C++时在释放资源中的实际操作是什么
    Python嵌入C/C++时在释放资源中的实际操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。你对Python嵌入C/C++释放资源这一方面的具体实际应用是否感兴趣...
    99+
    2023-06-17
  • C#快速实现IList非泛型类接口的自定义类作为数据源
    目录一、利用VS的修补程序快速继承IList二、实现必须的成员使用可以绑定数据源的控件我们需要有实现了IList接口的类作为数据源,我们有很多的方法,比如使用ArrayList或者L...
    99+
    2023-02-06
    C# IList数据源
  • 操作系统内存分配和释放:发现计算机资源管理的玄妙之处
    内存分配和释放是任何操作系统必不可少的核心功能之一,负责协调应用程序与内存资源之间的交互。通过高效的内存管理,操作系统确保程序能够安全、可靠地访问所需内存空间,从而实现应用程序的顺利运行。 1. 内存分配的基本概念 内存分配是指操作系统...
    99+
    2024-02-12
    内存分配 内存释放 内存管理 操作系统
  • 揭秘操作系统内存分配和释放的秘密,发现计算机资源管理的精巧设计
    一、内存分配的原理 内存分配是指操作系统将物理内存分配给应用程序使用。当应用程序需要内存时,它会向操作系统发出请求,操作系统会根据应用程序的请求分配一段连续的物理内存空间。这段物理内存空间由操作系统管理,应用程序只能通过操作系统的接口访...
    99+
    2024-02-12
    操作系统 内存分配 内存释放 物理内存 虚拟内存 页表 内存管理单元
  • 操作系统内存分配和释放:开启计算机资源管理的奇妙旅程,发现内存的奥秘
    内存,作为计算机系统中最重要的资源之一,是程序运行的舞台,也是数据存储的载体。对于操作系统来说,内存管理是一项关键任务,它需要确保程序能够获得足够的内存空间来运行,同时也要防止内存被浪费。内存分配和释放是内存管理中的两个核心操作,它们决...
    99+
    2024-02-12
    内存 内存管理 内存分配 内存释放 操作系统
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作