2011-09-21 17 views
7

開啓代碼分析在VS建議調用Dispose對象上(這點我是不previuosly)我結束了包含此方法:設置一HTMLControl時

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方法在使用後放置對象而不是堅持使用它?

+2

R#真的建議你應該配置'HtmlLink'嗎?你可以截圖嗎?這不應該發生。 – bzlm

+0

@bzlm,我會換個話題,它給了我重新使用的選擇,對於混淆抱歉。 – Mantorok

+1

那麼你的擔心是正確的。您不應該處理添加到控件集合的ASP.NET Web窗體控件。作爲一般說明,R#提供的選項並不總是適用的;你應該謹慎使用它們。 :)如果您嘗試在代碼中輸入許多不同的東西,您很快就會注意到這一點。 – bzlm

回答

2

我要說的是,這個代碼不應該工作,但如果你說這是工作的話,我能想到的唯一的事情是:

  • Header.Controls.Add添加對象的副本使處理原件沒有問題。
  • Dispose方法不會清除以後使用的任何內容。

希望這會有所幫助。

+3

它是後者添加不復制對象 –

+0

不知道爲什麼有人低估了我。我想爭論你爲什麼認爲我的回答不正確。請告訴我。 –

+0

我沒有讓你失望,但猜測DV可能是因爲第一個項目符號不正確 –

1

如果使用任何非託管資源調用favicon上的方法,它將會發出異常。

從MSDN:

您可以實例化資源對象,然後傳遞變量 using語句,但這並不是最好的做法。在這種情況下, 對象在控制離開使用塊(即使 )後仍保留在範圍內,儘管它可能不再有權訪問其非託管 資源。換句話說,它將不再完全初始化。如果 您嘗試使用使用塊之外的對象,則可能會導致引發 異常。由於這個原因, 實例化using語句中的對象並將其範圍限制爲 using塊通常更好。

using statement msdn

+0

這很有趣,因爲每個控件在ASP.Net中都有一個Render方法,那麼它是如何在一個處理對象上實現的呢? – Mantorok

+0

是的,如果它仍然有效,你就是幸運的。它可以打破任何更新或稍後更改。 – Peter

+1

你認爲Code Analysis知道嗎?或者它只是運氣!? – Mantorok

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

在大多數情況下,因爲垃圾收集器最終會完成它的工作,所以你不需要偏執狂版本的代碼。