我有丰富的Java
经验,知道为什么finalize()
计划很快删除。另一方面,我对C#
的了解是肤浅的——我或多或少知道它在抽象层面上提供了什么功能,但没有真正的经验。不久前,我发现了一个寻找问题的解决方案,通过搜索支持类似C++
的析构函数的语言,CLI中出现了IDisposable
。
使后者成为持续支持的功能的区别是什么?
嗯,真的,它们不一样。
Java的finalize()
在C#的终结器中有一个直接等价物(声明为~T()
,其中T
是类名(。在现代代码中,由于终结器在实践中很难正确使用,所以现在非常不鼓励在C#中使用终结器。也许总有一天他们也会遭到抨击。与此同时,如果你真的需要这种行为,你真的应该使用安全手柄。
与终结器相比,IDisposable
似乎提供了资源的自动和确定性清理,就像C++的析构函数一样。太棒了!但我说看起来,因为实际上IDisposable
不是魔法。就其本身而言,它什么也不做。你真正的意思是using
语句,它实际上只是try
/finally
语句的语法糖,该语句在finally
部分调用Dispose()
(为了更好地度量,需要进行一些null检查(。
using var x = new T();
// ...
Java还具有CCD_;尝试使用资源";成语:
try (T x = new T()) {
// ...
}
然而CCD_ 17和CCD_;尝试使用资源";(C#2.0与Java 7(,因此它们在标准库和第三方库中的存在更加普遍。