c#托管资源和非托管资源区别

C# 释放内存空间的方法 当不再需要对象时释放内存空间对于防止内存泄漏和提高应用程序性能至关重要。C# 提供了多种方法来释放内存空间。 阅读详情

本文摘自:http://www.cnblogs.com/justinprc/archive/2011/05/09/2040897.html

 

在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源。
a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。
b.而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等……这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。
.Net平台中,CLR为程序员提供了一种很好的内存管理机制,使得程序员在编写代码时不需要显式的去释放自己使用的内存资源(这些在先前C和C++中是需要程序员自己去显式的释放的)。这种管理机制称为GC(garbage collection)。GC的作用是很明显的,当系统内存资源匮乏时,它就会被激发,然后自动的去释放那些没有被使用的托管资源(也就是程序员没有显式释放的对象)。
但正如上面说的,CLR的GC功能也只能释放托管资源,对于非托管资源例如窗口,文件和网络连接等,它都只能跟踪非托管资源的生存期,而不知道如何去释放它。这样就会出现当资源用尽时就不能提供资源能够提供的服务,windows的运行速度就会变慢。这样的情况会出现在数据库的连接当中,当你没有显式的释放一个数据库资源时,如果还是不断的申请数据库资源,那么到一定时候程序就会抛出一个异常。
所以,当我们在类中封装了对非托管资源的操作时,我们就需要显式,或者是隐式的释放这些资源。而上面提到的Finalize和Dispose方法分别就是隐式和显式操作中分别使用到的方法。
Finalize一般情况下用于基类不带close方法或者不带Dispose显式方法的类,也就是说,在Finalize过程中我们需要隐式的去实现非托管资源的释放,然后系统会在Finalize过程完成后,自己的去释放托管资源。
如果要实现Dispose方法,可以通过实现IDisposable接口,这样用户在使用这个类的同时就可以显示的执行Dispose方法,释放资源。

以下是MSDN上提出的Finalize和Dispose方法的使用指南,如果你的类遵循这个标准的话,你写出的类在.Net平台上就是一个“良民”。

Finalize
下面的规则概括了 Finalize 方法的使用指南。

1.仅在要求终结的对象上实现 Finalize。存在与 Finalize 方法相关的性能开销。
如果需要 Finalize 方法,应考虑实现 IDisposable,以使类的用户可以避免调用 Finalize 方法带来的开销。(juky_huang注:在实现IDisposable的类中,可以通过GC.SuppressFinalize来停止Finalize的运行,这样只要显式的调用了Dispose方法,就能给用户提供更小的开销。如果用户没有显式的调用Dispose方法,也就是没有停止Finalize的运行,这样就可以隐式的实现非托管资源的释放)
2.不要使 Finalize 方法更可见。它应该是 protected,而不是 public。 (juky_huang注:这个很重要,Finalize方法一般是系统调用,用户不去显式的调用它)
3.对象的 Finalize 方法应该释放对象拥有的任何外部资源。此外,Finalize 方法应该仅释放由对象控制的资源。Finalize 方法不应该引用任何其他对象。
4.不要对不是对象的基类的对象直接调用 Finalize 方法。在 C# 编程语言中,这不是有效的操作。
5.从对象的 Finalize 方法调用 base.Finalize 方法。(juky_huang注:就是派生类调用基类的Finalize方法)
注意   基类的 Finalize 方法由 C# 和 C++ 的托管扩展的析构函数语法自动调用。


Dispose
下面的规则概括了 Dispose 方法的使用指南:

1.在封装明确需要释放的资源的类型上实现处置设计方案。用户可以通过调用公共 Dispose 方法释放外部资源。
2.在通常包含控制资源的派生类型的基类型上实现处置设计方案,即使基类型并不需要。如果基类型有 close 方法,这通常指示需要实现 Dispose。在这类情况下,不要在基类型上实现 Finalize 方法。应该在任何引入需要清理的资源的派生类型中实现 Finalize。
3.使用类型的 Dispose 方法释放类型所拥有的任何可处置资源。
4.对实例调用了 Dispose 后,禁止 Finalize 方法通过调用 GC.SuppressFinalize 方法运行。此规则的例外情况是当必须用 Finalize 完成 Dispose 没有覆盖的工作时,但这种情况很少见。
5.如果基类实现 IDisposable,则调用基类的 Dispose 方法。
6.不要假定 Dispose 将被调用。如果 Dispose 未被调用,也应该使用 Finalize 方法释放类型所拥有的非托管资源。
7.处置了资源之后,在该类型(非 Dispose)上从实例方法引发一个 ObjectDisposedException。该规则不适用于 Dispose 方法,因为在不引发异常的情况下,该方法应该可以被多次调用。
8.通过基类型的层次结构将调用传播到 Dispose。Dispose 方法应释放此对象控制的所有资源和此对象所拥有的任何对象。例如,可以创建一个类似 TextReader 的对象来控制 Stream 和 Encoding,两者均在用户不知道的情况下由 TextReader 创建。另外,Stream 和 Encoding 都可以获取外部资源。当对 TextReader 调用Dispose方法时,它应该依次对 Stream 和 Encoding 调用 Dispose,使它们释放它们的外部资源。
9.应考虑在调用了对象的 Dispose 方法后不允许使用对象。重新创建已处置的对象是难以实现的方案。
10.允许 Dispose 方法被调用多次而不引发异常。此方法在首次调用后应该什么也不做。

有了以上的基础后,我们看一段代码,这段代码是Dispose的一个实现,这个代码如果仔细的去考虑的话,非常的有趣,在这里我们又会看到C#中一个非常常用的技术,多态性,如果你看过我在前面写的一篇关于虚拟方法的文章的话,你可以从中理解下面代码的精要之处。

public class BaseResource: IDisposable
{
// Pointer to an external unmanaged resource.
// 非托管资源
private IntPtr handle;
// Other managed resource this class uses.
// 托管资源
private Component Components;
// Track whether Dispose has been called.
// 是否已经释放资源的标志
private bool disposed = false;

// Constructor for the BaseResource object.
public BaseResource()
{
   // Insert appropriate constructor code here.
}

// Implement IDisposable.
// Do not make this method virtual.
// A derived class should not be able to override this method.
// 提供给外部用户显示调用的方法,实际操作是在类的带参数的虚函数Dispose(bool disposing)中实现
public void Dispose()
{
   // 表示用户显示调用
   Dispose(true);
   // Take yourself off the Finalization queue
   // to prevent finalization code for this object
   // from executing a second time.
   // 由于用户是显示调用,所以资源释放不再由GC来完成
   GC.SuppressFinalize(this);
}

// Dispose(bool disposing) executes in two distinct scenarios.
// If disposing equals true, the method has been called directly
// or indirectly by a user's code. Managed and unmanaged resources
// can be disposed.
// If disposing equals false, the method has been called by the
// runtime from inside the finalizer and you should not reference
// other objects. Only unmanaged resources can be disposed.
protected virtual void Dispose(bool disposing)
{
   // Check to see if Dispose has already been called.
   // 如果已经释放,不做再次的操作,出现在用户多次调用的情况下
   if(!this.disposed)
   {
    // If disposing equals true, dispose all managed
    // and unmanaged resources.
    if(disposing)
    {
     // Dispose managed resources.
     // 用户是显示调用的话,我们就要手工的操作托管资源
     Components.Dispose();
    }
    // Release unmanaged resources. If disposing is false,
    // only the following code is executed.
    CloseHandle(handle);
    handle = IntPtr.Zero;
    // Note that this is not thread safe.
    // Another thread could start disposing the object
    // after the managed resources are disposed,
    // but before the disposed flag is set to true.
    // If thread safety is necessary, it must be
    // implemented by the client.

   }
   disposed = true;       
}

// Use C# destructor syntax for finalization code.
// This destructor will run only if the Dispose method
// does not get called.
// It gives your base class the opportunity to finalize.
// Do not provide destructors in types derived from this class.
// 析构函数
~BaseResource()    
{
   // Do not re-create Dispose clean-up code here.
   // Calling Dispose(false) is optimal in terms of
   // readability and maintainability.
   // 表示本次调用是隐式调用,由Finalize方法调用,即托管资源释放由GC来完成
   Dispose(false);
}

// Allow your Dispose method to be called multiple times,
// but throw an exception if the object has been disposed.
// Whenever you do something with this class,
// check to see if it has been disposed.
public void DoSomething()
{
   if(this.disposed)
   {
    throw new ObjectDisposedException();
   }
}
}

// Design pattern for a derived class.
// Note that this derived class inherently implements the
// IDisposable interface because it is implemented in the base class.
public class MyResourceWrapper: BaseResource
{
// A managed resource that you add in this derived class.
private ManagedResource addedManaged;
// A native unmanaged resource that you add in this derived class.
private NativeResource addedNative;
private bool disposed = false;

// Constructor for this object.
public MyResourceWrapper()
{
   // Insert appropriate constructor code here.
}
   // 重写Dispose方法,释放派生类自己的资源,并且调用基类的Dispose方法
protected override void Dispose(bool disposing)
{
   if(!this.disposed)
   {
    try
    {
     if(disposing)
     {
      // Release the managed resources you added in
      // this derived class here.
      addedManaged.Dispose();       
     }
     // Release the native unmanaged resources you added
     // in this derived class here.
     CloseHandle(addedNative);
     this.disposed = true;
    }
    finally
    {
     // Call Dispose on your base class.
     base.Dispose(disposing);
    }
   }
}
}
// 在这里,派生类没有实现~MyResourceWrapper和public Dispose方法,应为他们已经继承了基类的这些特性,这也是我说本示例代码精要之处,他使用到了多态性原理,下面我会简单分析
// This derived class does not have a Finalize method
// or a Dispose method without parameters because it inherits
// them from the base class.


本示例中有两个类一个是基类BaseResource,一个是派生类MyResourceWrapper,首先我们必须理解一下几点:
1.类型的 Dispose 方法应该释放它拥有的所有资源。它还应该通过调用其父类型的 Dispose 方法释放其基类型拥有的所有资源。该父类型的Dispose 方法应该释放它拥有的所有资源并同样也调用其父类型的 Dispose 方法,从而在整个基类型层次结构中传播该模式。
2.如果显式的调用了Dispose方法,我们就在Dispose方法中实现托管资源和非托管资源的释放,使用 GC.SuppressFinalize 方法来停止Finalize方法。因为如果用户调用了Dispose方法,那么我们就不必隐式的完成资源的释放,应为Finalizes会大大的减损性能。(Finalize一般只用于用户没有显式的调用Dispose方法,需要我们隐式完成时才使用)
3.要确保始终正确地清理资源,Dispose 方法应该可以被多次调用而不引发任何异常

示例中最主要的一个方法就是带参数的Dispose方法,本例中所有的具体操作都是放到这里来做的,它是一个受保护的虚函数,可以被派生类重写,并且如果派生类自己有对非托管资源的调用,那么派生类就要按照上面提到的要求,首先释放自己的资源,然后调用base.Dispose来实现基类的资源释放。(juky_huang注:这就是我们所谓的传播特性)
带参数的Dispose方法通过所带的参数disposing来判断,本次的Dispose操作是由Finalize发起还是由用户显式的调用公共Dispose方法发起的。如果为true则表示由公共的Dispose方法发起,如果为false表示是在GC调用Finalize方法时候发起。所以当为true时,我们就需要释放托管资源和非托管资源,并且禁止GC的Finalize操作,因为用户可以直接通过显示调用来减小性能开销。如果为false时,表示我们只需要释放非托管资源,因为本次调用是由GC的Finalize引起的,所以托管资源的释放可以让GC来完成。
示例中还有一个值得注意的地方,就是在多次显示调用Dispose时,如果资源已经处置,那么我们就要忽略本次操作,而不抛出异常。这个特性由disposed来决定。

好了,现在我们来看看这个程序的一个精要之处,那就是在派生类中,没有公共的Dispose方法,和Finalize方法(就是析构函数),那如果我们调用派生类对象时,是怎么实现资源释放的呢,刚开始我也不是很了解,后来仔细一看,突然发现其实很简单,它使用到了类的多态性来完成。
因为在派生类中使用了方法重写,所以在派生类中的Dispose(bool disposing)方法的派生度最大。由于基类中的Finalize和公共Dispose方法都是调用的是Dispose(bool disposing)方法,所以最终调用的是派生度最大的哪个函数,也就派生类中的Finalize和公共Dispose方法都是调用派生类自己的Dispose(bool disposing)方法。对于虚拟方法,可以参看我写的一篇文章地址是:

http://blog.youkuaiyun.com/juky_huang/archive/2005/10/26/517069.aspx

例如,现在我们有一个派生类实例A,如果我们显示调用A.Dispose()方法,它会去调用基础中的public Dispose方法这是由于继承的原因,在public Dispose方法中调用的又是Dispose(bool disposing)方法,由于这个方法已经被重写,所以它实际调用的不是基类中的Dispose(bool disposing)方法,而是A自己的Dispose(bool disposing)方法。这是根据运行时类型来定的。所以最终还是实现了,先调用A中的资源释放,然后才调用base.Dispose方法来完成基类的资源释放。
如果用户没有显示调用Dispose方法,那么Finalize方法就会有效,过程和上面是类似的。

从上面可以看出,对于非托管资源的释放,有一个很好的规则,只要我们按照这个规则来做,你写的代码就是.Net中的“良民”。

C#中的托管资源与非托管资源介绍 本文介绍了C#中托管资源与非托管资源的区别与管理方式。托管资源由CLR自动管理(如字符串、集合等),GC会自动回收;非托管资源(如文件句柄、数据库连接等)需手动释放,否则会导致内存泄漏。开发中应优先使用using语句管理非托管资源,自定义非托管资源类需实现IDisposable接口。文章通过三个示例展示了纯托管资源、非托管资源使用using释放,以及自定义非托管资源类的实现方式,强调正确管理资源是编写高效稳定程序的基础。 阅读详情

相关推荐

ctftools-all-in-one使用说明

OAEP (Optimal Asymmetric Encryption Padding) 是一种用于RSA加密的填充方案,目的是提高RSA加密的安全性。在CTF比赛中,如果模数N的两个因子比较接近,使用"费马分解(N)"可能会更快地得到结果;OAEP 是 RSA 的一种标准填充方式(在 PKCS#1 v2.0+ 中定义),因此这类题目本质上仍是 RSA 题,但。,导致你不能直接用常规的 RSA 解密公式 �=�� mod �m=cdmodN 得到有意义的明文。如果你在 CTF 中遇到 RSA 题,

2501_91682449的博客 1713

整理c#托管资源和非托管资源区别

托管的概念是在.net框架诞生后出现的。用比较通俗的话解释就是运行在.net框架下,并受.net框架管理的应用或其他组件称为托管的,反之为非托管的。也就是说用.net平台开发出来的程序应该就是托管的了,而在.net以前开发的程序都属于非托管的。但是非托管的程序完全可以通过在.net平台下重新生成而变成托管的 ,你就把.net framework理解为一个Microsoft的Java Virtu

慕兮 专栏 2366

恒玄BES2700ZP开发实战:从零搭建嵌入式音频系统

本文详细介绍了恒玄BES2700ZP蓝牙音频SoC的开发实战,从环境搭建、SDK架构解析到蓝牙音频、AI语音集成及低功耗优化。重点探讨了如何利用其多核架构实现高性能音频处理和LE Audio支持,为开发者提供从零构建嵌入式音频系统的完整指南。

o1p2q3r的博客 918

C# 托管资源/非托管资源有什么区别

托管资源/非托管资源有什么区别?

qq_38192821的博客 698

贝加莱Automation Studio 4.10安装保姆级教程:从官网下载到解决.Net 3.5报错

本文提供贝加莱Automation Studio 4.10的详细安装教程,涵盖从官网下载到解决.Net 3.5报错的全过程。特别针对工业自动化开发环境中常见的.Net Framework 3.5安装问题,提供多种经过验证的解决方案,包括控制面板安装、DISM命令离线安装和手动下载安装包等方法,帮助工程师顺利完成PLC开发环境的搭建。

weixin_30955617的博客 712

LAMMPS模拟新合金没势函数?手把手教你用`pair_style hybrid`混合势函数(附FeCMnSiTi案例)

本文详细介绍了在LAMMPS中如何使用`pair_style hybrid`混合势函数模拟新型高熵合金(如FeCMnSiTi),解决缺乏现成势函数的问题。通过实战案例,涵盖参数查找、命令编写、错误排查等关键步骤,特别适合处理多组元体系的复杂相互作用。文章还提供了EAM势函数与LJ势的组合技巧,帮助研究者准确模拟合金性能。

weixin_30635053的博客 243

详解C# 托管资源和非托管资源

托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等。这类资源,垃圾回收器在清理的时候会调用Object.Finalize()方法。默认情

liujzss的专栏 2717

别再手动填序号了!用Python脚本在Arcgis属性表里实现分组自动编号(附完整代码)

本文详细介绍了如何利用Python脚本在Arcgis属性表中实现分组自动编号,告别低效的手工操作。通过核心代码解析和实战教程,帮助GIS工程师快速掌握自动化编号技术,提升工作效率并降低错误率。特别适合城市规划、国土调查等需要处理大量分组数据的场景。

weixin_42532473的博客 307

c#中的非托管资源释放 (Finalize和Dispose)

在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源。 a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。 b.而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等……这些资源一般情况下不存在于Heap(内存中...

weixin_30608503的博客 330

华为Watch的ECG功能技术分析

华为Watch的ECG(心电图)功能通过硬件传感器、算法优化和医疗认证的结合,实现了对心脏电活动的监测和房颤(AFib)等心律失常的预警。采用医疗级ECG模拟前端芯片(AFE),如TI(德州仪器)的ADS1292R等,支持低噪声、高采样率(通常≥200Hz)。结合PPG(光学心率)数据交叉验证,提高检测可靠性(如ECG和PPG心率不一致时触发警告)。通过RR间期变异性判断心律是否规则,识别房颤(AFib)的典型特征(如不规则不规则心律)。结合加速度计数据,识别手臂运动导致的信号失真,动态调整算法参数。

xu_wenming的博客 6441

2023全国职业技能大赛 网络系统管理 服务部署 Linux部分--基础配置

服务器和客户端基本配置如下表,各虚拟机已预装系统。一、关闭防火墙和Selinux。七、需要使用到的命令详解。三、修改root密码。

weixin_62926639的博客 999

(转)c#托管资源和非托管资源区别

c#托管资源和非托管资源区别 托管的概念是在.net框架诞生后出现的。用比较通俗的话解释就是运行在.net框架下,并受.net框架管理的应用或其他组件称为托管的,反之为非托管的。  也就是说用.net平台开发出来的程序应该就是托管的了,而在.net以前开发的程序都属于非托管的。但是非托管的程序完全可以通过在.net平台下重新生成而变成托管的 ,你就把.net framework理解为一

RainyLin-SunnyLin的专栏 2491

MFC 中实现 WebSocket 客户端以支持实时双向通信

3. **协议兼容**:若服务器使用 `wss://`(加密),需在 `lws_client_connect_info` 中配置 SSL 相关参数(`ssl_connection = LCCSCF_USE_SSL`)。- 编辑框(`m_editUrl`):输入 WebSocket 服务器地址(如 `ws://echo.websocket.events`)。2. 将编译后的库文件(`.lib`、`.dll`)和头文件路径添加到 MFC 项目中(项目属性 -> VC++ 目录)。// UI:服务器地址。

寒寒豆豆软件公司的博客 202

【转】c#托管资源和非托管资源区别

#托管资源和非托管资源区别 托管的概念是在.net框架诞生后出现的。用比较通俗的话解释就是运行在.net框架下,并受.net框架管理的应用或其他组件称为托管的,反之为非托管的。 也就是说用.net平台开发出来的程序应该就是托管的了,而在.net以前开发的程序都属于非托管的。但是非托管的程序完全可以通过在.net平台下重新生成而变成托管的 ,你就把.net framework理解为一个...

weixin_30628077的博客 163

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java 托管 非托管_C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别...

在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源。a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。b.而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等……这些资源一般情况下不存在于Heap(内存中用于存储对象实...

weixin_31063289的博客 161

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# using 三种使用方式 C#中托管与非托管 C#托管资源和非托管资源区别

1.using指令。using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到。 例如:using System; 一般都会出现在*.cs中。 2.using别名。using + 别名 = 包括详细命名空间信息的具体的类型。 这种做法有个好处就是当同一个cs引用了两个不同的命名...

weixin_34224941的博客 283

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

[转]在C#中使用托管资源和非托管资源的区别,以及怎样手动释放非托管资源:...

托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源。托管资源的回收工作是不需要人工干预的,有.NET运行库在合适调用垃圾回收器进行回收。 非托管资源指的是.NET不知道如何回收的资源,最常见的一类非托管资源是包装操作系统资源的对象,例如文件,窗口,网络连接,数据库连接,画刷,图标等。这类资源,垃圾回收器在清理的时候会调用Object.Fi...

weixin_30497527的博客 124

【转】编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...

建议50:在Dispose模式中应区别对待托管资源和非托管资源 真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源。 提供给调用者调用的显式释放资源的无参Dispose方法中,调用参数是true: public void Dispose() { /...

dianzhuique8587的博客 99

C# 托管资源 与 非托管资源

C# 托管资源 与 非托管资源 托管资源:一般是指被CLR控制的内存资源,这些资源由CLR来管理。可以认为是.net 类库中的资源。 非托管资源:不受CLR控制和管理的资源,比如文件流,数据库的连接,网络连接,系统的窗口句柄,打印机资源等, 这类资源一般不存在堆上。可以认为操作系统资源的一组API。 对于托管资源,GC负责垃圾回收。对于非托管资源,GC可以跟踪非托管资源的生存期,但是不知道如何释放它,这时候就要人工进行释放。 2、CLR:公共语言运行库(Common Language Runtime,CLR

weixin_50180191的博客 2595

C#中关于非托管资源的释放

托管资源与非托管资源的区别 资源分为托管资源和非托管资源。 托管资源是指由CLR管理分配和释放的资源,也就是我们直接new出来的对象; 非托管资源是指不受CLR控制的资源,也就是不属于.net本身的功能,往往通过调用跨平台程序集(如C++)或者操作系统提供的一些接口,比如Windows内核对象、文件操作、数据库连接、socket、win32API、网络等。 标准的显式释放资源 public c...

qq_21209307的博客 923
上一篇: Javascript this关键字使用分析
下一篇: javascript之object小结
VS_URL
博客等级 码龄15年 12粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值