2011-01-11 11 views
7

IDisposable'ı uygulayan bir sınıfım var, çünkü bu özel ("yapıcıda başlatılan") özel bir üye "foo" özelliğine sahip. Beklenmedik bir şekilde foo'yu bertaraf etmemi istediğim bir CA2000 Kod Analizi hatası alıyorum. Ancak, bununla ilgilenmesi gereken sınıfımın Dispose() kodunda foo.Dispose() var.Neden CA2000'i kimliğimi kullanabileceğim bir sınıfın içinde kimliği olan özel bir üyeyle alıyorum?

Bazılarını aradım ve şaşırtıcı bir şekilde bir cevap bulamıyorum. Neyi yanlış yapıyorum? Açıkçası temel bir şeyi özlüyorum. Bunu aşmak için kodumu nasıl yazarım?

Benim VB kodu:

Public Class Bar 
    Implements IDisposable 

    Private Foo As SomeDisposableThing 

    Public Sub New() 
     Foo = New SomeDisposableThing() With {.name = "hello"} 
    End Sub 

    '''' snip '''' 

    Private disposedValue As Boolean = False  ' To detect redundant calls ' 

    Protected Overridable Sub Dispose(ByVal disposing As Boolean) 
     If Not Me.disposedValue Then 
      If disposing Then 
       If Foo IsNot Nothing Then Foo.Dispose() 
      End If 
     End If 
     Me.disposedValue = True 
    End Sub 

    Public Sub Dispose() Implements IDisposable.Dispose 
     Dispose(True) 
     GC.SuppressFinalize(Me) 
    End Sub 

End Class 

cevap

7

CA2000 hata IDisposable uygulayan konteyner ziyade düzgün bertaraf almayan bir yerel kullanılması anlamına gelmez. Bunun nedeni, tek kullanımlık nesnedeki bir nesne başlatıcısını kullanmanızdır. Bir istisna temp.Name = "hello" hattında meydana gelmesi için oluşturulan alacak gerçek kod aslında düzgün her durumda bir IDisposable bertaraf değil gibi bu kodu doğru FxCop tarafından işaretlendiğinde

Dim temp = New SomethingDisposable() 
temp.Name = "hello" 
Foo = temp 

şudur (bu mümkün bu durumda bertaraf edilmez).

düzeltme burada bir nesne başlatıcı kullanmak ve Foo doğrudan

Foo = New SomethingDisposable() 
Foo.Name = "hello" 
+0

Yuck başlatmak getirmemektir. İleti: bir özelliği kullanmayın :( –

+0

@Hans, bir alan olsa bile aynı davranışın olacağını düşünüyorum.Verileriniz bir istisna oluşturabilir (örneğin, örneğin ThreadAbort), böylece * tahmin ediyorum * FxCop Alanlar ve mülkler için eşit olarak ikaz ederdi. Bu teoriyi henüz test etmemiştim. – JaredPar

+0

Denemedim, denedim. –