避免在c#中使用`using`关键字进行多次处理的最佳做法

Cœu*_*œur 2 c# idisposable using-statement windows-store-apps

当变量是IDisposable时,我们有using关键字来管理处理.但是,如果我们在方法中返回值,那么我们应该有using两次吗?

StringContent stringToStringContent(string str)
{
    using (StringContent content = new StringContent(str))
    {
        return content;
    }
}

void logStringContent()
{
    using (StringContent content = stringToStringContent("test"))
    {
        Debug.WriteLine(content.ToString());
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面这个例子中,我只有1 new但我有2个using相同的东西.所以我觉得它不平衡.是否更好:

a)保持两者using,语言/编译器知道它的工作,以避免双重处置?

b)只保留usingnew一起,而在其他情况下,没有必要?:

void logStringContent()
{
    StringContent content = stringToStringContent("test");
    Debug.WriteLine(content.ToString());
    return;
}
Run Code Online (Sandbox Code Playgroud)

c)只有using在你不回来时才保留,并且在你返回时不需要保留?:

StringContent stringToStringContent(string str)
{
    return new StringContent(str);
}
Run Code Online (Sandbox Code Playgroud)

我唯一能感觉到的是b)不是正确的答案,因为它不适用于此处描述的问题:.NET HttpClient在多次请求后挂起(除非Fiddler处于活动状态)

Jon*_*eet 6

我认为这c是正确的答案 - 你从方法返回(引用)一个对象 - 在你返回之前已经处理掉了那个对象是没有意义的.例如,File.OpenRead不会丢弃它返回的流,不是吗?

在方法文档中指出调用者负责处理对象是个好主意.同样,一些方法接受一次性类型并声明调用者不应该自己处理对象.在这两种情况下,都有效地转移了妥善处理物品的责任.