作者psvsps2 (Op颖)
看板C_Sharp
标题[心得] IDisposable一点心得
时间Fri Jun 3 16:05:20 2005
1.C#中的using(......)
Myclass obj = new Myclass();
using(obj)
{
obj.somemethods();
}
等同下面程式码(可以检视IL确认)
Myclass obj = new Myclass();
try
{
obj.somethods();
}
finally
{
if(obj!=null)
{
IDisposable d;
d = obj;
d.Dispose();
}
}
所以没有实做IDisposable的物件用using(..){...},在编译时就会出现错误。
2.IDisposable 凡是需要额外释放resource(通常是unmanaged resource -- Handle..,
或是高代价的resource如Database的connection),都应该实做这个interface,实作
了这个interface就代表Class可以透过Dispose()来明确指定释放资源,而非依赖
Garbage Collection的机制。(关於IDisposable的实做还关系到Finalize()及thread
safe相关讨论,MSDN有清楚的说明)
3.了解了IDisposable後我们已经知道自己设计的Class再什麽时候需要时做IDisposable
,使用这些实做IDisposable的Class可以用setp1.说的using(...){...}来明确指定
释放的时机,不过使用using(...){....}有一个明显的缺点,就是他不能同时运用到
没有实做IDisposable的物件上面。在我们使用其他公司开发的Library会出现一些问题,
到底使用的物件要不要呼叫Dispose()来释放掉?
这边提供一个通用的方式(也是处理Interface的建议使用方法)
try
{
MyClasss obj = new MyClass obj;
:
:
}
finally
{
IDisposable dispose = obj as IDisposable;
if(dispose != null)
{
dispose.Dispose();
}
}
以上的用法适用所有可能实做某Interface的物件,也可以将物件间的耦合关系降低,
比如MyClass再下一版本把IDisposable拿掉了,上面的程式一样不需要任何的修改。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.75.23.122