返回在'中创建的实例;使用'声明
本文关键字:声明 使用 实例 创建 返回 | 更新日期: 2023-09-27 18:08:15
如果我有这个方法:
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
语句,但随后确保调用代码使用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)
文档规定,只要需要位图,就必须保持流活动。事实上,处置位图也处置了流,所以您仍然只有一个资源来跟踪…但是你需要知道你不能关闭流
让GetResourceStream
方法把using语句放在它返回的对象周围是没有意义的。这意味着您将返回一个处于已处理状态的对象,这有什么好处呢?它会向你抛出ObjectDisposed
异常。
因此,在您的工厂方法中删除using
语句,并应用using
语句,您实际上是使用它。
它应该看起来像这样:
public StreamReader GetResourceStream(string filename)
{
Stream stream = this.GetType().Assembly.GetManifestResourceStream(filename);
return new StreamReader(stream)
}
当程序流退出第二个using块时,sr.Dispose()将被调用,处理StreamReader并使其无用。
你需要在flow control退出block之前使用sr