我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#中如何释放非托管资源

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#中如何释放非托管资源

这篇文章主要介绍“C#中如何释放非托管资源”,在日常操作中,相信很多人在C#中如何释放非托管资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中如何释放非托管资源”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

.NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象

最简单的办法,可以通过实现protected void Finalize()(析构函数会在编译时变成这个东东)来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法,如果是则调用它。但,据说这样会降低效率……

有一种更好的,那就是通过实现一个接口显式的提供给客户调用端手工释放对象的方法,而不是傻傻的等着GC来释放我们的对象(何况效率又那么低)

System 命名空间内有一个 IDisposable 接口,拿来做这事非常合适,就省得我们自己再声明一个接口了

另外补充一句,这种实现并不一定要使用了非托管资源后才用,如果你设计的类会在运行时有大些的实例(象 GIS 中的Geometry),为了优化程序性能,你也可以通过实现该接口让客户调用端在确认不需要这些对象时手工释放它们

示例:

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4.  

  5. namespace Example20 {   

  6. class Program {   

  7. class Class1 : IDisposable {   

  8. //析构函数,编译后变成 protected void Finalize(),
    GC会在回收对象前会调用调用该方法~Class1(){  

  9. Dispose(false);  

  10. }  

  11.  

  12. //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,
    据说那样会降低效率void IDisposable.Dispose(){   

  13. Dispose(true);  

  14. }  

  15.  

  16. //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力

  17. protected virtual void ReleaseUnmanageResources({  

  18. //Do something……  

  19. }  

  20. //私有函数用以释放非托管资源private void Dispose(bool disposing){   

  21. ReleaseUnmanageResources();  

  22. //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法  

  23. //为false时肯定是GC调用了对象的Finalize方法,
    所以没有必要再告诉GC你不要调用我的Finalize方法啦if (disposing{  

  24. GC.SuppressFinalize(this);} static void Main(string[] args){   

  25. //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧Class1 tmpObj1 = new Class1();  

  26. //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些  

  27. //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧  

  28. //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率  

  29. Class1 tmpObj2 = new Class1()((IDisposable)tmpObj2)。Dispose();  

C#学习经验之P/Invoke是什么?

在受控代码与非受控代码进行交互时会产生一个事务(transition) ,这通常发生在使用平台调用服务(Platform Invocation Services),即P/Invoke

如调用系统的 API 或与 COM 对象打交道,通过 System.Runtime.InteropServices 命名空间,虽然使用 Interop 非常方便,但据估计每次调用事务都要执行 10 到 40 条指令,算起来开销也不少,所以我们要尽量少调用事务,如果非用不可,建议本着一次调用执行多个动作,而不是多次调用每次只执行少量动作的原则。

C#学习经验之StringBuilder 和 String 的区别?

String 虽然是一个引用类型,但在赋值操作时会产生一个新的对象,而 StringBuilder 则不会,所以在大量字符串拼接或频繁对某一字符串进行操作时***使用 StringBuilder,不要使用 String

示例:

  1. using System;  

  2. using System.Collections.Generic;  

  3. using System.Text;  

  4.  

  5. namespace Example22 {  

  6. class Program {   

  7. static void Main(string[] args){   

  8. const int cycle = 100000;  

  9.  

  10. long vTickCount = Environment.TickCount;  

  11. String str = null;  

  12. for (int i = 0; i < cycle; i++)  

  13.  

  14. str += i.ToString();  

  15. Console.WriteLine
    ("String: {0} MSEL", Environment.TickCount - vTickCount);  

  16.  

  17. vTickCount = Environment.TickCount;  

  18. //看到这个变量名我就生气,奇怪为什么大家都使它呢? :)  

  19.  

  20. StringBuilder sb = new StringBuilder();  

  21. for (int i = 0; i < cycle; i++)  

  22.  

  23. sb.Append(i);  

  24. Console.WriteLine
    ("StringBuilder: {0} MSEL", Environment.TickCount - vTickCount);  

  25.  

  26. Console.ReadLine();  

到此,关于“C#中如何释放非托管资源”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#中如何释放非托管资源

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

下载Word文档

猜你喜欢

C#中如何释放非托管资源

这篇文章主要介绍“C#中如何释放非托管资源”,在日常操作中,相信很多人在C#中如何释放非托管资源问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中如何释放非托管资源”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-18

C#中怎么释放托管资源

这期内容当中小编将会给大家带来有关C#中怎么释放托管资源,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源
2023-06-17

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

这篇文章主要介绍了C#怎么实现IDisposable接口释放非托管资源的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#怎么实现IDisposable接口释放非托管资源文章都会有所收获,下面我们一起来看看吧。当
2023-06-30

c#非托管内存的释放问题如何解决

这篇“c#非托管内存的释放问题如何解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“c#非托管内存的释放问题如何解决”文章吧
2023-07-05

c#关于非托管内存的释放问题及解读

这篇文章主要介绍了c#关于非托管内存的释放问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-26

C#中如何使用托管代码和非托管代码

C#中如何使用托管代码和非托管代码,需要具体代码示例在C#编程中,我们常常需要使用托管代码和非托管代码来实现一些特定的功能。托管代码是指运行在CLR(公共语言运行时)中,由CLR进行内存管理和资源分配的代码。而非托管代码则是指直接运行在操作
2023-10-22

wpf关闭窗口如何释放资源

在WPF中,关闭窗口时会自动释放窗口所占用的资源,包括窗口中的控件资源和事件处理程序。但是,如果窗口中有自定义的资源或者事件订阅者,则需要手动在关闭窗口时释放这些资源,以避免内存泄漏。以下是一些释放资源的方法:释放自定义资源:在窗口的Cl
wpf关闭窗口如何释放资源
2024-03-01

C++ 函数异常与资源管理:释放内存的正确姿势

在 c++++ 中,通过适当的异常处理和资源管理,可以安全有效地释放内存和管理资源:异常处理:try-catch 块用于捕获和处理异常,并释放获取的资源以防止内存泄漏。资源管理:std::unique_ptr 和 std::shared_p
C++ 函数异常与资源管理:释放内存的正确姿势
2024-05-03

exit函数在Linux程序中如何优雅地释放资源

在Linux程序中,当你需要优雅地释放资源并退出程序时,可以使用exit()函数包含头文件:在程序中包含stdlib.h头文件,以便使用exit()函数。#include 注册清理函数:使用atexit()函数注册一个或
exit函数在Linux程序中如何优雅地释放资源
2024-08-30

Win8/8.1系统如何释放C盘空间以节省宝贵的C盘资源

不少使用Win8、Win8.1系统的用户不难发现,原先只占用30G大小的系统盘,随着使用时间的增加,C盘的磁盘空间不断减少,那这部分减少的空间跑去哪里了?我们又该怎么释放C盘空间呢?由于Windows系统的特殊环境,一般减少的空间都是主要集
2022-06-04

Python嵌入C/C++时在释放资源中的实际操作是什么

Python嵌入C/C++时在释放资源中的实际操作是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。你对Python嵌入C/C++释放资源这一方面的具体实际应用是否感兴趣
2023-06-17

windows资源管理器中如何选定多个非连续文件

本文小编为大家详细介绍“windows资源管理器中如何选定多个非连续文件”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows资源管理器中如何选定多个非连续文件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧
2023-02-21

如何进行C++代码的资源管理?

如何进行C++代码的资源管理?以C++为例,资源管理是程序开发中非常重要的一环。良好的资源管理可以提高程序的性能和稳定性,减少内存泄漏和资源浪费。本文将介绍一些常用的C++资源管理技术和最佳实践。1.使用智能指针:C++11引入了智能指针的
如何进行C++代码的资源管理?
2023-11-02

如何深度剖析C++资源管理细节

如何深度剖析C++资源管理细节,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们从系统结构的角度上讲,C/C++ 支持 3 种内存管理方式,基于栈的C++资源管
2023-06-17

如何对C++资源管理内容分析研究

这篇文章给大家介绍如何对C++资源管理内容分析研究,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。下面进行对C++资源管理的问题进行讲解,那么首先要对C++语言的概念进行了解,所谓C++语言:它是一种使用非常广泛的计算机
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录