在使用C#中返回用于使用的变量

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()在以后再打电话.

  • 感觉就像`foo()`==`GetUsefulDataTable()`和`using`块应该调用这个函数. (4认同)

Jon*_*eet 9

是的,它将处置它 - 然后返回它.这几乎总是一件坏事.

事实上DataTable,Dispose几乎从不做任何事情(例外情况是,如果它在某处,IIRC),但它仍然是一个普遍的坏主意.通常,您应该将处置对象视为无法使用.


Tob*_*oby 7

据说,这是创建一次性对象的工厂方法的模式.但是,我仍然看到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:在丢失范围之前处置对象.