声明并初始化使用块中的变量

时间:2014-05-13 16:06:18

标签: c# variables using

在这里提出一些建议,关于最佳实践编码 - 我仍然是C#的初学者。我一直在阅读如何使用块对于处理对象和尝试实现它们至关重要。

我的问题是,如果你声明并初始化一个变量,它是否也应该在一个使用块中呢?

我已经测试过,似乎编译得很好。但是会赞赏人们对此的看法。

谢谢,

4 个答案:

答案 0 :(得分:2)

使用块仅对实现IDisposable接口的对象有用。它粗略地转化为尝试... finally块在finally中处理对象。您可以查看更多详细信息here

答案 1 :(得分:0)

通常的做法是声明最接近您需要的变量。如果它没有在使用区块(或任何其他区块)之外使用,那么通常没有理由在外面宣布它。

答案 2 :(得分:0)

没有。将任何变量放在使用中都不是必需的。它基本上有助于RAII习惯用法,它在.NET中通常仅用于包装/使用非托管资源的对象。这些对象的标准模式是实现IDisposable。使用关键字只是

的一些很好的语法糖

尝试{//初始化并使用变量} finally {//强制转换为IDisposable - 如果不为null,则调用Dispose()}

即使它会编译和工作,如果你的对象没有实现IDisposable,它根本就没用。

答案 3 :(得分:0)

你问题的答案"它是否也应该在使用区块中?"确实是一个范围问题。当块退出时,在块的范围内声明的变量(try,using等)将超出范围。

考虑以下两个例子:

  1. 声明变量,在块中分配,退出块,需要变量。

    WebHeaderCollection headers;
    
    using (var cl = new WebClient())
    {
        headers = cl.ResponseHeaders;
    }
    
    // headers is still in scope
    foreach (var k in headers.AllKeys) 
        Debug.WriteLine("{0} : {1}", k, headers[k]);
    
  2. 在块中声明并赋值变量,退出块,需要变量

    using (var cl = new WebClient())
    {
        var headers = cl.ResponseHeaders;
    
        // use headers here, just fine
        foreach (var k in headers.AllKeys) 
            Debug.WriteLine("{0} : {1}", k, headers[k]);
    }
    
    // headers is no longer in scope
    foreach (var k in headers.AllKeys) 
        Debug.WriteLine("{0} : {1}", k, headers[k]);
    
  3. 选项#2抛出异常。因此,首先确定变量的范围要求,然后在使用块结束后确定是否需要它。