2011-11-08 68 views
1

我偶爾會發現自己將thisMe傳遞給子對象。如這個濃縮的現實世界的例子....NET:將自我傳遞給子對象

Public Class Entity 

    Private mValidator as New EntityValidator() 

    Readonly Property IsValid() 
     Return mValidator.Validate(Me) 
    End Property 

End Class 

我很關心.Validate(Me)。我沒有收到任何警告或代碼分析違規,但只是感覺不對。我對無限遞歸和垃圾收集感到緊張。

我們在項目上有內存泄漏,我想知道是否是由於這個原因造成的。我從來沒有找到解決問題的任何資源。

這種做法行得通,還是我的偏執理應得到?

+1

爲什麼不驗證靜態? – JSWork

+1

我同意@JSWork:我們可能會遺漏一些在EntityValidator上設置屬性的代碼,它會證明Validate()不是靜態的,但其他所有條件都是相同的,它應該是一個靜態方法,它甚至不需要實例在第一位。 –

+0

你是說讓EntityValidator.Validate()靜態和我的代碼讀取返回EntityValidator.Validate(Me)? – nunzabar

回答

1

在VB和C#中允許循環引用。一個參考基本上不過是機器內存中的一個機器WORD的大小值。如果存在對象A和B,並且如果A指向B和B指向A,則A在內部只保存一個指向實際對象B的值,而B僅具有指向A的實際對象的值。

其他人比我更好地解釋循環引用,請嘗試this thread, about circular references並檢查第一個答案。但總而言之:不,他們不會損害您的計劃,並且他們被允許且有效,甚至是常見的。

如果你想找出你的內存泄漏來自哪裏,請嘗試內存分析。

+0

@nuzabar:什麼讓你覺得你有內存泄漏?你對垃圾收集了解多少? – JSWork

3

這本身不會導致內存泄漏,並且將this傳遞給另一個對象本身並沒有什麼錯誤。但是,我會對第二個對象實際上保留對傳入對象的引用的情況保持警惕,因爲循環引用通常會導致可理解性和可維護性方面的問題。