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

标签 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 语句没有任何区别?

最佳答案

您应该更改方法本身而不是以包含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/

相关文章:

c# - 如何从路线获取数组?

c# - asp.net 4.0 的 Ajax 扩展错误

c# - 将命名空间前缀添加到 XmlRoot 属性

c# - OneSignal 推送通知 ClickEvent 显示空值 Windows Phone 8.1 C#

c# - 什么时候需要 Dispose?

html - 如何为 ms-outlook ://compose body parameter for Outlook for iOS 配置 HTML 正文

C# 包命名空间

c++ - "using"在这个实例中做什么,存储了什么?

c# - 如果您使用 “using” 语句,是否需要在流或写入器上调用 Flush()?

c# - 处理命令并直接在命令上定义连接时,连接是否关闭?