博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#IDisposable 接口&资源释放
阅读量:4287 次
发布时间:2019-05-27

本文共 2114 字,大约阅读时间需要 7 分钟。

一、IDisposable 接口

提供一种用于释放非托管资源的机制。

特别说明:托管资源一般有Framework自动释放,所以该接口的主要目的是用来处理非托管资源的释放。

若要浏览此类型的 .NET Framework 源代码,请参阅。

命名空间:   
程序集:  mscorlib(位于 mscorlib.dll)

[ComVisibleAttribute(true)]public interface IDisposable
System_CAPS_pubmethod

执行与释放或重置非托管资源关联的应用程序定义的任务。

常用场景模板实例:

public class Foo : IDisposable{    private bool disposed = false;    //既释放托管资源,又释放非托管资源    public void Dispose()    {        Dispose(true);        //将对象从垃圾回收器链表中移除,              //从而在垃圾回收器工作时,只回收托管资源,而不执行对象的析构函数        GC.SuppressFinalize(this);    }    protected virtual void Dispose(bool disposing)    {        if (!disposed)        {            if (disposing)            {                //释放托管资源            }            // 释放非托管资源            disposed = true;        }    }    //析构函数不是人工调用,由垃圾回收器调用,用于释放非托管资源    ~Foo()    {        Dispose(false);    }}
二、继承了IDisposable 接口的类,可以使用using {} 块自动释放处理

三、验证实例,释放托管或非托管实例

class Student : IDisposable{    public int StuID { get; set; }    public List
carList { get; set; } ~Student() { Dispose(false); //手动释放非托管资源 Console.WriteLine($"Student对象被释放,StuID={StuID}"); } public Student() { carList = new List
(); for (int i = 0; i < 5; i++) { carList.Add(new Car() { CarID = i }); } } protected virtual void Dispose(bool disposing) { if (disposing) { //释放托管资源 carList = null; } //释放非托管资源,省略 //....... } ///
/// 外部调用释放托管和非托管资源 /// public void Dispose() { this.Dispose(true); //请求公共语言运行时不要调用指定对象的终结器。 GC.SuppressFinalize(this); }}
验证代码一:

static void TestThree(){    // using(){} 语句块,自动调用Dispose()    using (Student stu = new Student() { StuID = 2 })    {        Console.WriteLine("释放之前》");        Console.WriteLine(stu == null);    }    //清空处理    GC.Collect();}
验证代码二:

static void TestTwo(){    Student stu = new Student() { StuID = 2 };    Console.WriteLine("释放之前》");    Console.WriteLine(stu == null);    //释放资源    stu.Dispose();    int id = stu.StuID;    Console.WriteLine(stu == null);    //清空处理    GC.Collect();}

更多:

转载地址:http://znogi.baihongyu.com/

你可能感兴趣的文章
php框架
查看>>
常用正则表达式
查看>>
PHP多个版本的分析解释
查看>>
20个非常有用的PHP类库
查看>>
PHP常用组件下载列表
查看>>
angular本地、远程数据循环
查看>>
AngularJS的五个超酷特性
查看>>
现在主流的免费手机号码归属地查询api接口
查看>>
Android 的动作、广播、种别等标识大全
查看>>
源码Action
查看>>
利用Action的常用Intent跳转
查看>>
Android Permission
查看>>
Notifaction安卓通知栏
查看>>
RingtoneManager铃声设置
查看>>
WifiManager设置
查看>>
PackageManager安装包管理
查看>>
Pixel,Bitmap,Drawable,Canvas,Paint,Matrix,BitmapDrawable,BitmapFactory图相关
查看>>
SQLLite常用代码
查看>>
Fragment
查看>>
android多线程,子线程与主线程的通信,下载的文件的显示
查看>>