返回在'中创建的实例;使用'声明

本文关键字:声明 使用 实例 创建 返回 | 更新日期: 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