处理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方法在使用后放置对象而不是坚持使用它?
我会说这个代码不应该工作,但如果你说它的工作,那么我能想到的唯一的事情是:
希望这可以帮助。
如果使用任何非托管资源调用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下一篇: Is there a way to disable Access 2007's Code editors CTRL+Y Shortcut key?