在这里提出一些建议,关于最佳实践编码 - 我仍然是C#的初学者。我一直在阅读如何使用块对于处理对象和尝试实现它们至关重要。
我的问题是,如果你声明并初始化一个变量,它是否也应该在一个使用块中呢?
我已经测试过,似乎编译得很好。但是会赞赏人们对此的看法。
谢谢,
答案 0 :(得分:2)
使用块仅对实现IDisposable
接口的对象有用。它粗略地转化为尝试... finally块在finally中处理对象。您可以查看更多详细信息here。
答案 1 :(得分:0)
通常的做法是声明最接近您需要的变量。如果它没有在使用区块(或任何其他区块)之外使用,那么通常没有理由在外面宣布它。
答案 2 :(得分:0)
没有。将任何变量放在使用中都不是必需的。它基本上有助于RAII习惯用法,它在.NET中通常仅用于包装/使用非托管资源的对象。这些对象的标准模式是实现IDisposable。使用关键字只是
的一些很好的语法糖尝试{//初始化并使用变量} finally {//强制转换为IDisposable - 如果不为null,则调用Dispose()}
即使它会编译和工作,如果你的对象没有实现IDisposable,它根本就没用。
答案 3 :(得分:0)
你问题的答案"它是否也应该在使用区块中?"确实是一个范围问题。当块退出时,在块的范围内声明的变量(try,using等)将超出范围。
考虑以下两个例子:
声明变量,在块中分配,退出块,需要变量。
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]);
在块中声明并赋值变量,退出块,需要变量
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]);
选项#2抛出异常。因此,首先确定变量的范围要求,然后在使用块结束后确定是否需要它。