如果我有这个方法:
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
语句没有任何区别?
最佳答案
您应该更改方法本身而不是以包含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)
文档指出,只要需要位图,就必须使流保持事件状态。事实上,处理位图也会处理流,因此您仍然只有一个资源可以跟踪...但您需要知道您不能关闭流。
关于c# - 返回在 'using' 语句中创建的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7368249/