建议52:及时释放资源垃圾回收机制自动为我们隐式地回收了资源(垃圾回收器会自动调用终结器),那我们为什么要主动释放资源呢?private void buttonOpen_Click(object sender,EventArgs e){ FileStream fileStream = new F.....
建议49:在Dispose模式中应提取一个受保护的虚方法在标准的Dispose模式中,真正的IDisposable接口的Dispose方法并没有做实际的清理工作,它其实是调用了下面的这个带bool参数且受保护的的虚方法: /// /// 非密封类修饰用protected...
建议51:具有可释放字段的类型或拥有本机资源的类型应该是可释放的在建议50中,我们将C#中的类型分为:普通类型和继承了IDisposable接口的非普通类型。非普通类型除了包含那些托管资源的类型外,本身还包含一个非普通类型的字段。在标准的Dispose模式中,我们对非普通类型举了一个例子:一个非普通...
建议50:在Dispose模式中应区别对待托管资源和非托管资源真正资源释放代码的那个虚方法是带一个bool参数的,带这个参数,是因为我们在资源释放时要区别对待托管资源和非托管资源。提供给调用者调用的显式释放资源的无参Dispose方法中,调用参数是true: public void D...
建议48:Dispose方法应允许被多次调用一个类型的Dispose方法应该允许被多次调用而不抛出异常。鉴于此,类型内部维护了一个私有的bool变量disposed,如下:private bool disposed = false;在实际清理代码的方法中,加入一下判断:if(disposed){ ....
建议47:即使提供了显式释放方法,也应该在终结器中提供隐式清理在标准的Dispose模式中,我们注意到一个以~开头的方法,如下: /// /// 必须,防止程序员忘记了显式调用Dispose方法 /// ~SampleClass() ...
建议46:显式释放资源需继承接口IDisposableC#中的每一个类型都代表一种资源,资源分为两类:托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象。非托管资源:不受CLR管理的对象,如Windows内核对象,或者文件、数据库连接、套接字、COOM对象等。如果我们的类型使用了非...
建议45:为泛型类型参数指定逆变逆变是指方法的参数可以是委托或者泛型接口的参数类型的基类。FCL4.0中支持逆变的常用委托有:FuncPredicate常用委托有:IComparer下面例子演示了泛型类型参数指定逆变所带来的好处: class Program { stati...
建议44:理解委托中的协变委托中的泛型变量天然是部分支持协变的。为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder(string name); static void ...
建议43:让接口中的泛型参数支持协变除了上一建议中提到的使用泛型参数兼容接口不可变性外,还有一种办法是为接口中的泛型声明加上out关键字来支持协变,如下所示: interface ISalary //使用out关键字 { void Pay(); } ...