Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 显式转换为IDisposable_C#_.net_Idisposable_Explicit Implementation - Fatal编程技术网

C# 显式转换为IDisposable

C# 显式转换为IDisposable,c#,.net,idisposable,explicit-implementation,C#,.net,Idisposable,Explicit Implementation,我正在使用一些XmlReader和XmlWriter对象对一些try…catch块中的字符串执行一些必要的工作 我知道使用表示法using(XmlReader NewReader=XmlReader.Create(…)是首选语法,但我并不喜欢这样,所以我也在最后添加块并执行NewReader.Close()和NewWriter.Close() 然而,代码分析抱怨这些对象没有被释放,因此迫使我以某种方式调用Dispose()方法 问题是在这些类中,Dispose()方法是显式实现的,因此我必须使用

我正在使用一些
XmlReader
XmlWriter
对象对一些
try…catch
块中的字符串执行一些必要的工作

我知道使用表示法
using(XmlReader NewReader=XmlReader.Create(…)
是首选语法,但我并不喜欢这样,所以我也在最后添加
块并执行
NewReader.Close()
NewWriter.Close()

然而,代码分析抱怨这些对象没有被释放,因此迫使我以某种方式调用
Dispose()
方法

问题是在这些类中,
Dispose()
方法是显式实现的,因此我必须使用
((IDisposable)(NewReader)).Dispose()
((IDisposable)(NewWriter)).Dispose()


这种技术有什么缺点吗?

使用
语句确实是首选的解决方案。这是C#的惯用用法。这些类显式地实现了
IDisposable
,因为它们已经提供了一个具有关闭语义的方法:
Close
。我打赌
Dispose
调用
Close
,反之亦然。但你不应该指望这一点,无论如何都应该调用
Dispose

最后,所有这些都是等效的:

  • 使用
    使用
    ,这是首选
    
  • 调用
    finally
    块上的
    Close
    ,并抑制静态分析警告或
  • 最后
    ((IDisposable)NewReader.Dispose()上调用
    Dispose
  • C#
    using
    语句将始终为您调用
    Dispose
    。它大致可以转化为以下内容:

    XmlReader NewReader = XmlReader.Create(...);
    try
    {
       // do stuff on NewReader 
    }
    finally
    {
        ((IDisposable)NewReader).Dispose();
    }
    

    因此,最后将其包装在
    中不会增加任何价值。虽然
    Close
    Dispose
    通常是等效的,但情况并非总是如此。因为这个FxCop是正确的,所以您应该始终调用
    Dispose
    ,当您执行此操作时(或者让
    using
    语句执行此操作),没有理由手动调用
    Close

    不使用
    using
    有很好的理由:

    • 当对象的生存期可能需要比当前块更长时
    避免使用
    的理由也不充分:

    • “我真的不喜欢那样”
    好的理由是否适用于您的代码


    还请注意,一个简单的扩展方法将使语法变得简洁明了。

    为什么不使用using语句呢。它完成了您需要执行的所有操作,您不会收到fxcop警告,而且它比使用try-finally更简洁。不幸的是,
    Close
    Dispose
    的行为并不总是相同的。除了关闭的实例通常可以重新打开这一明显区别,而已释放的实例不能,一些对象在调用
    Close
    (例如
    SqlConnection
    )时不会抑制终结,这会强制您无论如何调用
    Dispose
    ,以防止对GC施加额外压力。