我收到Win32Exception
这个臭名昭着的错误:Error creating window handle.
但直到最近,我才发现它发生在一条试图调用Environment.Exit(0)
的线路上摆脱,只是让形式靠近自己。
所以我的问题是,每当我知道我不再需要表格时,我总是打电话给base.Close()
和base.Dispose(true)
。如果我这样做,是否真的有必要将表单放在using
块中?
答案 0 :(得分:3)
这不是必要的。但是,using块是一个方便且易于安全的编程结构。即。忘记添加对dispose的调用是很常见的。当您选择“使用”块时,您永远不必担心处置对象。因此,最好使用“使用”块来练习所有一次性物品。
您没有提到您调用Dispose方法的位置。它应该总是在finally块中,如下所述。
DisposableClass disposableObj = null;
try
{
disposableObj = new DisposableClass();
....
....
}
finally
{
if( disposableObj != null)
{
disposableObj.Dispose();
}
}
上述代码可以简化为
using(DisposableClass disposableObj = new DisposableClass())
{
.....
.....
}
答案 1 :(得分:0)
是。如果不使用using
,如果您的代码在到达显式Dispose
调用之前因任何原因抛出异常,则您的对象将不会被处置。
答案 2 :(得分:0)
不是真的。它基本上为您提供更清晰简洁的语法。在内部,使用创建一个try..catch..finally块(msdn),如果你愿意,你可以复制。
SomeClass obj = null;
try
{
obj = new SomeClass();
obj.SomeOperation();
}
catch()
{
}
finally
{
if(obj != null)
obj.Dispose();
}
不确定是否有必要这样做,但如果你能用单一的状态网来做到这一点,你为什么要这样做。
答案 3 :(得分:0)
在封装在Dispose()
块中的对象上调用using
不。但是,对于您的问题,最好将一次性对象封装在using
块中,因为它确保始终调用该对象上的Dispose()
方法。
无论如何,这段代码:
using (var disposableObject = new DisposableObject())
{
// Perform some action...
}
在实践中等同于:
try
{
var disposableObject = new DisposableObject();
// Perform some action...
}
finally { disposableObject.Dispose(); }
这是因为在内部,using
块始终会在您的对象上调用Dispose()
。实际上,作为实现using
语句的要求,您选择的对象必须实现IDisposable
才能进行编译。
在Dispose()
块的末尾添加额外的using
调用是不必要且多余的。