di3*_*3go 10 c# dispose idisposable using using-statement
我正在使用using语句中的using语句返回我正在创建的变量(听起来很有趣):
public DataTable foo ()
{
using (DataTable properties = new DataTable())
{
// do something
return properties;
}
}
Run Code Online (Sandbox Code Playgroud)
这将Dispose属性变量??
这样做后我仍然得到这个警告:
警告34 CA2000:Microsoft.Reliability:在方法'test.test'中,在对所有对它的引用超出范围之前,对对象'properties'调用System.IDisposable.Dispose.
有任何想法吗?
谢谢
Rob*_*vey 10
如果你想要返回它,你不能将它包装在一个using语句中,因为一旦你离开大括号,它就会超出范围而被处理掉.
你必须像这样实例化它:
public DataTable Foo()
{
DataTable properties = new DataTable();
return properties;
}
Run Code Online (Sandbox Code Playgroud)
并Dispose()在以后再打电话.
是的,它将处置它 - 然后返回它.这几乎总是一件坏事.
事实上DataTable,Dispose几乎从不做任何事情(例外情况是,如果它在某处,IIRC),但它仍然是一个普遍的坏主意.通常,您应该将处置对象视为无法使用.
据说,这是创建一次性对象的工厂方法的模式.但是,我仍然看到Code Analysis也抱怨这个:
Wrapper tempWrapper = null;
Wrapper wrapper = null;
try
{
tempWrapper = new Wrapper(callback);
Initialize(tempWrapper);
wrapper = tempWrapper;
tempWrapper = null;
}
finally
{
if (tempWrapper != null)
tempWrapper.Dispose();
}
return wrapper;
Run Code Online (Sandbox Code Playgroud)
这应该保证如果初始化失败,则对象被正确处理,但是如果一切都成功,则从该方法返回一个未曝光的实例.
MSDN文章:CA2000:在丢失范围之前处置对象.
| 归档时间: |
|
| 查看次数: |
8651 次 |
| 最近记录: |