返回在'using'语句中创建的实例

时间:2011-09-09 22:50:25

标签: c# using

如果我有这个方法:

public StreamReader GetResourceStream(string filename)
{
    using (Stream stream = this.GetType().Assembly.GetManifestResourceStream(filename))
    using (StreamReader sr = new StreamReader(stream))
    {
        return sr;
    }
}

当我打电话给它时,我应该这样打电话吗

StreamReader resource = GetResourceStream("blah.xml");

或者这样:

using (StreamReader resource = GetResourceStream("blah.xml"))
{
    // Do stuff
}

如果采用第二种方法,这是否意味着使用using (StreamReader sr = new StreamReader(stream))声明using行没有任何区别?

3 个答案:

答案 0 :(得分:7)

您应该更改方法本身而不是以包含using语句,但请确保调用代码使用using语句:

public StreamReader GetResourceStream(string filename)
{
    return new StreamReader(GetType().Assembly
                                     .GetManifestResourceStream(filename));
}

using (StreamReader resource = GetResourceStream("blah.xml"))
{
    // Do stuff
}

这样,当你实际使用时,它只会处理资源。基本上,该方法将返回资源的所有权授予调用者。这还不算太糟糕 - 它甚至相当普遍(想想File.OpenText等)。

当你将资源传递给方法或构造函数时,它变得更加棘手 - “被调用”代码是否取得所有权?通常不会,但偶尔也是合适的 - 例如,Bitmap(Stream)文档声明只要需要位图,就必须保持流的活动状态。事实上,处理位图处理流,所以你仍然只有一个资源来跟踪...但是你需要知道你不能关闭流。< / p>

答案 1 :(得分:3)

GetResourceStream方法将using语句放在它返回的对象周围是没有意义的。这意味着你将返回处于处置状态的对象,这有什么用处?它会抛出ObjectDisposed个例外。

因此,请删除工厂方法中的using语句,并使用将<{1}}语句应用于

看起来应该更像这样:

using

答案 2 :(得分:1)

当程序流退出第二个使用块时,将调用sr.Dispose(),处理StreamReader并使其无效。

在流程控制退出该块之前,您需要使用sr。