如果您明确处置表单,是否有必要使用使用块?

时间:2016-02-08 04:14:45

标签: c# winforms

我收到Win32Exception这个臭名昭着的错误:Error creating window handle.但直到最近,我才发现它发生在一条试图调用Environment.Exit(0)的线路上摆脱,只是让形式靠近自己。

所以我的问题是,每当我知道我不再需要表格时,我总是打电话给base.Close()base.Dispose(true)。如果我这样做,是否真的有必要将表单放在using块中?

4 个答案:

答案 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调用是不必要且多余的。