我看到大量带有以下语法的代码片段
using (RandomType variable = new RandomType(1,2,3))
{
// A bunch of code here.
}
为什么不直接声明变量并使用它?
这种使用语法似乎只是使代码混乱并使其可读性降低。如果变量仅在该范围内可用,那么为什么不将该块放在函数中呢?
答案 0 :(得分:11)
使用有一个非常明确的目的。
它设计用于实现IDisposable的类型。
在你的情况下,如果RandomType实现了IDisposable,它将在块的末尾得到.Dispose()'d。
答案 1 :(得分:9)
using (RandomType variable = new RandomType(1,2,3))
{
// A bunch of code here.
}
几乎相同(有一些细微差别):
RandomType variable = new RandomType(1,2,3);
try
{
// A bunch of code
}
finally
{
if(variable != null)
variable.Dispose()
}
请注意,在调用“使用”时,您可以将任何内容转换为IDisposable:
using(RandomType as IDisposable)
finally中的空检查将捕获任何实际上不实现IDisposable的内容。
答案 2 :(得分:4)
不,它不会使您的代码混乱,也不会降低其可读性。
using语句只能用于IDisposable类型(即实现IDisposable的类型)。
通过在using-block中使用该类型,当using-block的范围结束时,将使用该类型的Dispose方法。
所以,告诉我哪些代码对您来说不太可读:
using( SomeType t = new SomeType() )
{
// do some stuff
}
或
SomeType t = new SomeType();
try
{
// do some stuff
}
finally
{
if( t != null )
{
t.Dispose();
}
}
答案 3 :(得分:1)
在using语句中使用的对象必须实现IDisposable,因此在作用域的末尾,您可以保证将调用Dispose(),因此理论上,您的对象应该在此时释放。在某些情况下,我发现它使我的代码更清晰。
答案 4 :(得分:1)
using关键字提供了一种确定性方法来清理对象分配的托管或非托管资源。如果不使用using关键字,则在完成该对象时,您有责任调用Dispose()(或在某些情况下,Close())。否则,在下一次垃圾收集之前,可能无法清理资源,甚至根本不清除资源。
答案 5 :(得分:1)
根据MSDN,以下using
代码:
using (Font font1 = new Font("Arial", 10.0f))
{
byte charset = font1.GdiCharSet;
}
扩展到:
{
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
}
它确实不会使你的代码混乱。事实恰恰相反!