处理HtmlControl

根据VS中的代码分析的建议,在一个对象上调用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方法在使用后放置对象而不是坚持使用它?


我会说这个代码不应该工作,但如果你说它的工作,那么我能想到的唯一的事情是:

  • Header.Controls.Add添加对象的副本,以便在处理原始内容时没有问题。
  • Dispose方法不会清理稍后使用的任何内容。
  • 希望这可以帮助。


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

    从msdn:

    您可以实例化资源对象,然后将该变量传递给using语句,但这不是最佳实践。 在这种情况下,尽管可能不再有权访问其非托管资源,但在控制离开使用块后,对象仍保留在范围内。 换句话说,它将不再完全初始化。 如果您尝试在使用块之外使用该对象,则可能会导致引发异常。 出于这个原因,通常最好在using语句中实例化对象,并将其范围限制为using块。

    使用语句msdn


    我假定你的代码分析给了你CA2000:在你更改代码之前丢失范围之前处理对象。 问题在于,即使从方法返回后(它已添加到集合中),也不应该丢弃对象,因为要使用它。

    您可以使用SuppressMessage属性来抑制消息,也可以将代码重写为真正的偏执:

    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

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

    链接地址: http://www.djcxy.com/p/9147.html

    上一篇: Disposing a HtmlControl

    下一篇: Is there a way to disable Access 2007's Code editors CTRL+Y Shortcut key?