如果我有这个方法:
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
行没有任何区别?
答案 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。