C#构造函数与资源释放Dispose

简介

构造函数

资源释放

简介

C#中struct和class的访问权限级别是一样,默认都是private;都是通过new来分配,其区别是:

  • struct定义的是值类型,其实例在栈上分配内存;
  • class定义的是引用类型,其实例在堆上分配内存;

使用资源后,需要释放:

  • 托管资源:即由CLR里new出来的对象,由CLR管理分配和释放;
  • 非托管资源:不受CLR管理的对象;Windows内核对象,如文件、数据库连接、套接字、COM对象等;

构造函数

C#中每个类型都有构造函数;构造函数的顺序:

  • 静态构造函数:先初始化类型的静态变量,再执行函数体内语句;
  • 普通构造函数:先初始化成员变量,再执行函数体内的语句;
class First
{
    public First(string strTag)
    {
        Console.WriteLine("First-construct: {0}", strTag);
    }
}
class Second
{
    static First fOne = new First("Static");
    First fTwo = new First("Normal");
    static Second()
    {
        Console.WriteLine("Static second-construct");
    }

    public Second()
    {
        Console.WriteLine("Normal second-construct");
    }
}

static void Main(string[] args) {
    Second sOne = new Second();
    // 输出:
    // First-construct: Static
    // Static second-construct
    // First-construct: Normal
    // Normal second-construct
}

资源释放

C#可以定义一个Finalizer和Dispose方法以释放资源。

  • Finalizer样式与C++的类似(~后跟类名),但是其调用时间不确定,是在运行时(CLR)垃圾回收时才会被调用;
  • Dispose:需要继承接口IDisposable,标识需要显式释放资源;
public class MyObject : IDisposable{
    private bool _disposed;

    ~MyObject() {
        Dispose(false);
    }

    public void Dispose() {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    public void Close() {
        Dispose();
    }    
    protected virtual void Dispose(bool disposing) {
        if (_disposed) return;
        if (disposing) {
            // 清理托管资源
        }
        // 清理非托管资源 

        // 标记已经被释放。
        _disposed = true;
    }
}
using(var obj=new MyObject()){
    // 完成后自动调用Dispose释放资源
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值