2011-09-21 12 views
7

Atılması Bu nesneyi Kontroller koleksiyonuna ekledikten sonra bertaraf etmeliyim, bu iyi bir fikir mi?Bir yöntem bu içeren ile sona erdi (ı previuosly değildi) bir nesnenin Dispose çağırmak VS Kod Analizi tavsiyesi üzerine bir HtmlControl

Bu nasıl çalışır? Controls.Add yöntemi, kullanıldıktan sonra nesneyi tuttuktan sonra kullandığı için mi?

+2

R # gerçekten HtmlLink'i Atlamanızı Önerir mi? Bunu ekran görüntüsü alabilir misin? Olmaması gerekiyordu. – bzlm

+0

@bzlm, Ben yeniden ifade edeceğim, bana bir karışıklık için özür dilerim, bir kullanım içine refactor seçeneği sunuyor. – Mantorok

+1

sonra endişeleriniz doğru.Denetim koleksiyonuna eklediğiniz ASP.NET Web Form denetimlerini atmamalısınız. Ve genel bir not olarak, R # tarafından sağlanan seçenekler her zaman uygulanabilir değildir; Onları dikkatli kullanmalısın. :) Kodunuzda farklı birçok şeyi alt-giriş yapmaya çalışırsanız, bunun böyle olduğunu çabucak fark edeceksiniz. – bzlm

cevap

2
Bu kod Aklıma gelen tek şey o zaman çalışıyor dersem çalışmak ancak gerektiğini söyleyebilirim

:

  • Header.Controls.Add bir ekleme Nesnenin kopyası, böylece orijinali tasfiye etmekte sorun yoktur.
  • Dispose yöntemi daha sonra kullanılan hiçbir şeyi temizlemez.

Bu yardımcı olur umarım.

+3

'u kontrol etmedim. Ekle Bu nesneyi kopyalamıyor –

+0

Neden birisi beni reddetti . Cevabımın neden doğru olmadığını düşündüğünüzü söylemek istiyorum. Lütfen söyle bana. –

+0

Seni reddetmedim ama ilk mermi yanlış olduğu için DV'yi tahmin edebilirim –

1

Yönetilmeyen kaynaklardan birini kullanan favicon üzerinde bir yöntem çağrılırsa, bu durum istisna verecektir. msdn itibaren

:

Sen kaynak nesnesi başlatır ve sonra kullanarak ifadeyi değişkeni geçer, ama bu iyi bir uygulama değildir olabilir. Bu durumda, bile kontrol bloğunu bıraktıktan sonra nesnesinin kapsamı kalır, ancak artık yönetilmeyen kaynaklarına erişemez. Başka bir deyişle, artık tamamen başlatılmayacaktır. Eğer nesneyi kullanma bloğu dışında kullanmayı denerseniz, atılacak bir istisnasına neden olursunuz. Bu nedenle, genellikle için, kullanım ifadesindeki nesneyi örneklendirmek ve kapsamını kullanma bloğunu ile sınırlamak daha iyidir.

using statement msdn

+0

Bu ilginçtir, çünkü her denetimin ASP.Net'te bir Render yöntemi vardır, bu yüzden bu, eldeki bir nesneye nasıl ulaşır? – Mantorok

+0

Evet, hala çalışıyorsa şanslısınız. Herhangi bir güncellemede kırılabilir veya daha sonra değişebilir. – Peter

+1

Sizce Kod Analizi bunu biliyor mu? Yoksa sadece şans mıydı? – Mantorok

0

Kodun değiştirilmesinden önce kod çözümlemesinin size CA2000: Dispose objects before losing scope verdiğini varsayalım. Sorun şu ki, nesneyi atmamalısınız çünkü yöntemi kullanmaktan sonra bile kullanmak istiyorsanız (bir koleksiyona eklenmiştir).

Sen SuppressMessage attribute kullanarak mesaj bastırmak ya yoksa gerçekten paranoyak olmaya size kodunu yeniden yazabilirsiniz:

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); 

Bu kodun normal akış bunu bertaraf için daha sonra sorumludur koleksiyonuna favicon ekler. Bununla birlikte, favicon.Attributes.Add'un bir istisna attığı anormal akış istisnayı yaymadan önce favicon'u atar.

Çoğu durumda, çöp toplayıcı eninde sonunda işini yapacağı için, kodun paranoid sürümüne ihtiyacınız yoktur.