在C#中使用using语句但不实现Dispose方法

4

我正在尝试理解C#中的using块。我是否可以在类似下面的using语句中创建一个不实现IDisposable接口的自定义对象?

Class A
{
}

using(A a = new A())
{
}

我收到一个错误提示,说“Error 1 'ConsoleApplication1.A': type used in a using statement must be implicitly convertible to 'System.IDisposable'”,该怎么解决这个错误?我不想要做Class A:IDisposable,还有其他方法吗?或者我们需要在使用块内部使用的自定义对象中实现IDisposable Dispose方法,这是强制性要求吗?

编辑:我并不希望得到MSDN和成千上万网站中提供的定义。我只是想理解这个错误以及如何纠正它。


您能详细说明为什么不想使用IDisposable吗?也许可以找到更好的替代方案。 - antiduh
@antiduh:好的,让我重新表达一下。那个“Convertible”错误是什么意思? - Jasmine
2个回答

12

使用 using 块是一种语法糖,仅适用于 IDisposable 对象。

以下的 using 语句:

using (A a = new A()) {
// do stuff
}

是语法糖,用来简化:

A a = null;

try {
  a = new A();
  // do stuff
} 
finally {
  if (!Object.ReferenceEquals(null, a))  
    a.Dispose();
}

为什么要调用两次new A? - Jonas Høgh
哎呀,你说得对。看起来已经被一些编辑修复了(谢谢!) - syazdani
@Divine,我真的不确定你在问什么。using只能与实现IDisposable接口的对象一起使用。这是它的唯一目的,所以直接回答问题:是的,你必须实现IDisposable才能让using语句工作。选择实现IDisposable取决于你是否需要立即释放资源(例如文件、画笔、互斥体、信号量等)在你的类中。如果你的类没有实现IDisposable,你就不使用using,并让垃圾回收器最终处理你的类。 - syazdani
@syazdani:谢谢,但是“Convertible”错误是什么意思?我不太明白它的含义。你能帮我理解一下吗?我本来期望看到的是“在使用USING时,应该在对象中实现IDisposable”。但是错误信息却说了另外一件事情。为什么这个错误信息不友好呢? - Jasmine
1
“隐式转换”只是指运行时应该能够将给定的对象转换为给定的类型并获得有意义的结果(在本例中,将A转换为IDisposable)。在某些情况下,编译器可以在编译时检查这一点,并在不可能的情况下向您发出错误提示(因为A没有实现IDisposable而为您执行此操作)。在此处阅读更多信息:http://en.wikipedia.org/wiki/Type_conversion - syazdani
显示剩余2条评论

4
使用 using 的主要目的是在 try 块中调用 Dispose,以便创建相当于 try 块的效果。如果没有 Dispose 方法,则使用语句将毫无意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接