【问题标题】:Using statement in C# without implementing Dispose Method在 C# 中使用语句而不实现 Dispose 方法
【发布时间】:2013-12-05 05:53:41
【问题描述】:

我试图了解在 C# 中使用块。我可以在下面的 Using 语句中创建一个不实现 IDisposable 接口的自定义对象吗?

Class A
{
}

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

它给我一个错误说“错误 1 ​​'ConsoleApplication1.A':在 using 语句中使用的类型必须隐式转换为 'System.IDisposable'”

如何纠正这个错误?我不想做 A 类:IDisposable

还有什么办法吗?还是强制要求我们在 using 块内部使用的这些自定义对象中实现 IDisposable Dispose 方法?

编辑:我不期待 MSDN 和数千个网站中的定义。我只是想了解这个错误以及纠正

【问题讨论】:

  • 您能否详细说明您不想使用 IDisposable 的原因?也许可以找到更好的东西。
  • @antiduh:好吧,让我为你改一下我的话。那个错误“Convertible”是什么意思

标签: c# .net c#-4.0 using


【解决方案1】:

使用块是语法糖,仅适用于 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();
}

【讨论】:

  • 为什么 2 次调用新 A?
  • 你应该离开a = new A();,因为变量a已经存在
  • 哎呀,你是对的.. 它似乎已被一些编辑修复(谢谢!)
  • @syazdani:这我在 3 年前就知道了,我的问题不是那个。我的问题和你理解的完全不一样
  • 所有“隐含可转换”意味着运行时应该能够将给定对象转换为给定类型并获得有意义的结果(在这种情况下,将 A 转换为 IDisposable)。在某些情况下,编译器可以在编译时检查这一点,如果不可能,就会给你一个错误(因为 A 没有实现 IDisposable,所以它正在为你做)。在这里阅读更多:en.wikipedia.org/wiki/Type_conversion
【解决方案2】:

使用的全部意义在于创建一个 try 块的等价物,并在 finally 中调用 Dispose。如果没有 Dispose 方法,那么 using 语句就没有意义。

【讨论】:

    猜你喜欢
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 2010-09-13
    相关资源
    最近更新 更多