2013-03-01 13 views
6

Bu önemli değil ama ne söylendiğini anlamaya çalışıyorum ve bu meşru bir uyarı mı? Birisi bu hatayı benim için basit bir şekilde açıklayabilir mi? 'CongressDBEntities': tek kullanımlık alanlarını kendiCA1001 Visual Studio 2012 Kod Analizi uyarısı. Bu ne demek?

CA1001 Türleri o aşağıdaki ıdisposable türlerinden üyelerini oluşturur çünkü

'MemVoteManager' üzerine IDisposable uygulamak atılabilir olmalıdır. 'MemVoteManager' daha önce gönderildiyse, bu tür kimliklendirilebilir 'u uygulayan yeni üyelerin eklenmesi, mevcut tüketicilerinin kırılma değişikliğidir.

public class MemVoteManager : AbstractDataManager, IMemVoteManager 
{ 
    private CongressDBEntities context = new CongressDBEntities(); 

    public int AddMemVote(tMemVoteScore mvs) 
    { 
     //Insert Model 
     context.tMemVoteScores.Add(mvs); 
     context.SaveChanges(); 

     int newPK = mvs.MemVoteScoresID; 

     //Update funky column ID with PK as well 
     var memVoteItem = (from m in context.tMemVoteScores 
          where m.MemVoteScoresID == newPK 
          select m).SingleOrDefault(); 

     memVoteItem.ID = memVoteItem.MemVoteScoresID; 
     context.SaveChanges(); 
     return newPK; 
    } 
+3

Bu uyarının yalnızca uyarıyı tekrar etmeden yapmanız gerektiğini bildirmesi zor olacaktır. Türünüzün bir alan oluşturduğu, bir nesne oluşturduğu ve bu nesnenin içine depolandığı, bu nesnenin IDisposable'ı uyguladığı bir alan olduğu için, bu alana nesnenin de atılmasını sağlamanız gerekir. Bu, temel olarak uyarının söylediği şeydir. Kırılma değişim kısmı, türünüzü kullanan mevcut herhangi bir kodun, "Dispose" (Akıl) ile oluşturulmamış olması ve bu nedenle bozulduğunda değişmesidir. –

cevap

7

Yani örneğin size kodunu değiştirmek Tüketiciler sınıfınız ile yapıldığı zaman, ancak içeriğin bir dersin üyesi olmama durumundan daha iyi olabilirsiniz. Sadece ihtiyacınız olduğunda oluşturun ve işiniz bittiğinde şekilde imha: Onlara her zaman yaratmak için büyük bir ceza yoktur yani

public int AddMemVote(tMemVoteScore mvs) 
{ 
    //Insert Model 
    using(CongressDBEntities context = new CongressDBEntities()) 
    { 
     context.tMemVoteScores.Add(mvs); 
     context.SaveChanges(); 

     int newPK = mvs.MemVoteScoresID; 

     //Update funky column ID with PK as well 
     var memVoteItem = (from m in context.tMemVoteScores 
          where m.MemVoteScoresID == newPK 
          select m).SingleOrDefault(); 

     memVoteItem.ID = memVoteItem.MemVoteScoresID; 
     context.SaveChanges(); 
    } 
    return newPK; 
} 

Bağlam hafiftir. Artı, daha sonra, tüketicileri bağlamı bertaraf etmenizi bildiren endişeleriniz için endişelenmenize gerek kalmaz ve eğer sınıfın bir örneği birçok kez kullanılırsa, bellekte çok fazla değişiklik olmaz.

+0

Ama sonuçta kapsam dışına çıktıktan sonra her şeyin çöp toplandığını sanıyordum?Ama hasta devam edin ve eğer bu analiz işlemi – punkouter

+1

@punkouter'i mutlu edecekse, yukarıda yaptığınız gibi sarın, bu düşünce süreciyle ilgili problem, nesnelerin bir kaç çeşit nesnesi olduğu anlamına gelir *** hiçbir zaman çöp toplamaya ulaşmaz. Bellek yönetimi, .NET'te otomatik olsa da, düşüncesiz değildir. Sonsuza kadar yaşayan bir nesne tarafından da başvurulan bir başka sınıfa başvurusu olan bir sınıfı düşünün. Biliyorum, bir kenar durumu gibi görünüyor - ama değil. *** Bu nesnelerin hiçbiri, uygulama kapanana kadar çöp toplanmayacaktır. –

+0

Tamam. Bu yüzden Tek kullanımlık uygulama yapmak ve onu çağırmak, sınıfın çöp toplanacağından emin olmanın bir yoludur ... Belki de şimdi gerekli değildir, ancak her zaman her zaman uygulamak için en iyi uygulama – punkouter

3

Size context atılabilir üyeleri içeren bu alanı bildirmiş oluyor. Yani, bu üyelerin üzerlerinde çağrılan Dispose() olması gerekir, böylece Çöp Toplama gerçekleşebilir. Bu nedenle, MemVoteManager üzerinde IDisposable arabirimini uygulayabilmeniz için, Dispose() öğesini bağlamda ve/veya tek kullanımlık üyeleriyle arayabilirsiniz. Böyle IDisposable arabirim üyeleri uygulamak ardından

public class MemVoteManager : AbstractDataManager, IMemVoteManager, IDisposable 

ve: Sen böylece bağlam bertaraf edilecektir IDisposable uygulayabileceği

public void Dispose() 
{ 
    // call dispose on the context and any of its members here 
} 
+0

Sınıfımdaki Idisposable'ı uygulayan herhangi bir sınıf iDisposable'ı da kullanmam gerektiği anlamına mı geliyor? Onsuz bir bellek sızıntısı oluşturabilir miyim? Yukarıda bahsettiğim gibi her şey çöp toplanmış olsa da .. yönetilen kod! – punkouter

+0

@punkouter, eğer sınıf, 'IDisposable' uygularsa, açıkça kurtulmak için yönetilmeyen bir kaynağa sahip olduğu anlamına gelir. Örneğin bir veritabanı bağlantısı *** (gerçek bağlantı) *** - bu yönetilmeyen bir kaynaktır. Dolayısıyla, bir bağlam nesnesine sahip olduğunuz için, nihayetinde yönetilmeyen kaynaklara yol açan başka nesneler de vardır, ** '' Dispose() ''yi çağırdığınızdan emin olmalısınız. –

+0

ancak DBcontext'in bir 'using' ile sarılması, bir iddianın uygulanması ile aynı olacak mı? – punkouter