【问题标题】:Do I need to call .Dispose() on both of these XmlDataSource objects? "CA2000 Dispose objects before losing scope" tells me to .Dispose() it我需要在这两个 XmlDataSource 对象上调用 .Dispose() 吗? “CA2000 在失去范围之前处理对象”告诉我 .Dispose() 它
【发布时间】:2015-10-23 13:34:48
【问题描述】:

在我极其简化的代码示例中,我的 Foo() 方法调用 GetXmlDataSource(),它返回一个 XmlDataSource。 CA2000 说我应该在失去范围之前Dispose() 一个 XmlDatasource。

  • 我应该将每个 XmlDataSource 包装在 using 语句中吗?
  • 我应该在下方使用try/catch/finally,在上方使用using
  • 我是否有效地拥有两个XmlDataSource 对象,一个在上层方法中,一个在下层方法中?

我对这方面的语言行为有点模糊,我想成为一个好男孩。

void Foo()
{
    XmlDataSource xds = GetXmlDataSource();
}

XmlDataSource GetXmlDataSource()
{
    XmlDataSource xmlDataSource = new XmlDataSource();
    return xmlDataSource;
}

【问题讨论】:

  • 你的最后一个问题:不,它们是引用类型,所以它只有一个。
  • 完成后,您应该在 Foo 方法中处理该对象。如果代码分析抱怨GetXmlDataSource,请尝试将其命名为CreateXmlDataSource,看看是否有区别。

标签: c# dispose xmldatasource


【解决方案1】:

我应该将每个 XmlDataSource 包装在 using 语句中吗?

如果它超出了该方法的范围,是的,你应该这样做。顺便说一下,你也可以对来自其他方法的变量使用using

我应该在下面使用 try/catch/finally 吗?

是的,不是的。 XmlDataSource 不应被丢弃,因为您打算在其他方法中使用它。如果你有一个异常会阻止变量被传递,你应该处理它。

我应该在上面使用 using 吗?

是的,你应该这样做。这段代码可以完成这项工作。

using (XmlDataSource xds = GetXmlDataSource())
{ }

我是否实际上有两个XmlDataSource 对象,一个在上层方法中,一个在下层方法中?

不,你有一个。这就是为什么你不应该处置较低的。有一个引用从一种方法传递到另一种方法。

【讨论】:

  • 感谢您的编辑。你说,“顺便说一句,你也可以对来自其他方法的变量使用using。”什么意思?
  • 喜欢这个:using (XmlDataSource xds = GetXmlDataSource()).
【解决方案2】:

1) 仅将最终用法包装在 using 中。 2)不,一个 using 就足够了(注意 using is 的底层实现是 try/finally)。 3) 你只有一个对象实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多