处理HtmlControl

时间:2011-09-21 08:18:05

标签: visual-studio-2010 resharper idisposable webforms

根据VS中Code Code的建议来调用一个对象上的Dispose(我之前并不是这样)我最终得到了一个包含这个的方法:

using (var favicon = new HtmlLink
                         {
                             Href = "~/templates/default/images/cc_favicon.ico"
                         })
{
    favicon.Attributes.Add("rel", "shortcut icon");
    Header.Controls.Add(favicon);
}

这让我有点困惑,如果我将这个对象添加到Controls集合之后处理这个对象是个好主意吗?

这仍然有效吗?是因为Controls.Add方法在使用后处理对象而不是保持它?

3 个答案:

答案 0 :(得分:2)

我会说这段代码不起作用但是如果你说它正在工作那么我能想到的唯一的事情就是:

  • Header.Controls.Add添加对象的副本,以便处理原始文件时没有问题。
  • Dispose方法不会清除以后使用的任何内容。

希望这有帮助。

答案 1 :(得分:1)

如果调用favicon上的方法使用任何非托管资源,它将给出异常。

来自msdn:

  

您可以实例化资源对象,然后将变量传递给   使用声明,但这不是最佳做法。在这种情况下,   控件离开使用块后,对象仍然在范围内   虽然它可能不再能够访问它的非托管   资源。换句话说,它将不再完全初始化。如果   你试图使用using块之外的对象,你冒险导致   被抛出的异常。出于这个原因,通常更好   在using语句中实例化对象并将其范围限制为   使用块。

using statement msdn

答案 2 :(得分:0)

我认为您在更改代码之前代码分析为您提供了CA2000: Dispose objects before losing scope。问题是你不应该处置你的对象,因为即使从方法返回后它也想要使用它(它已被添加到集合中)。

您可以使用SuppressMessage attribute来抑制邮件,也可以将代码重写为非常偏执:

var favicon = new HtmlLink { Href = "~/templates/default/images/cc_favicon.ico" };
try {
  favicon.Attributes.Add("rel", "shortcut icon");
}
catch {
  favicon.Dispose();
  throw;
}
Header.Controls.Add(favicon);

此代码的正常流程将favicon添加到负责处理它的集合中。但是,favicon.Attributes.Add抛出异常的异常流将在传播异常之前处置favicon

在大多数情况下,因为垃圾收集器最终会完成它的工作,所以你不需要偏执版本的代码。