2012-01-24 68 views
3

當我的項目運行代碼分析,我收到以下消息:VB.NET中公共變量和公共屬性有什麼區別? (代碼分析VS2010,CA1051:Microsoft.Design)

CA1051 : Microsoft.Design : Because field 'ClassName.VarName' is visible outside of its declaring type, change its accessibility to private and add a property, with the same accessibility as the field has currently, to provide access to it.

要解決這個問題,我可以更改以下行:

Public VarName As String 

這樣:

Public Property VarName As String 

我不明白爲什麼Property關鍵字在這種特殊情況下非常重要。任何人都可以提供一個解釋,爲什麼將這個成員改爲Property對代碼分析有重大影響?難道我做錯了什麼?

回答

1

Public Property VarName As String聲明提供封裝級別的屬性。您將能夠通過使用_VarName在您的類中訪問此變量的私有成員狀態。

Public VarName As String聲明瞭一個變量,該變量僅提供該變量的單個公共實例並且不封裝。

+0

那麼,使用封裝被認爲是.NET中的最佳實踐? – afuzzyllama

+0

我會這樣說,如果你想實現訪問控制(可能不在你的情況 - 也許將來?),或隱藏執行從調用代碼。 – alundy

+0

99.9%的疑問是我再也不會碰這個代碼,但我確實認爲帽子封裝對代碼的可維護性非常重要。 – afuzzyllama

2

將變量保密爲私有並提供公共屬性以訪問數據一直是良好的編程慣例。例如,如果以後需要添加一些在值更改時引發的事件,則將該代碼粘貼到set屬性中並且不需要觸摸使用該屬性的所有現有代碼但是如果你繼續使用這個變量,然後決定你需要引發一個事件,你將不得不創建一個屬性來設置該值並引發該事件,然後更新所有現有代碼以使用剛創建的新屬性而不是變量。

+0

總是自VB.Net,無論如何。在VB6中,你可以用一個屬性替換一個公共變量,而不需要觸及調用者。這是唯一比VB更好的東西。 – MarkJ

+0

即使在VB6中,第一次使用屬性也很好。讓你做一些你不應該做的事情並不一定是「更好的」。 – Nick

+0

爲什麼你認爲這是「你不應該做的事情」(在VB6中)?我的意思是,對於VB.Net來說,+1是一個很好的答案,但它不適用於VB6。在VB6中「如果你繼續使用這個變量,然後決定你需要引發一個事件,你將不得不創建一個屬性來設置這個值並引發這個事件,然後*你不需要觸摸任何現有的代碼,它會自動的使用財產「。 – MarkJ

2

封裝是OOD中的重要原則。如果你把你的成員暴露給其他人(我知道,我已經在自己咯咯地笑),但不能保證你能夠保持適當的狀態。

通過使用屬性,您可以通過定義關於如何訪問成員的明確指導來保護您的成員的狀態。

+0

確實如此。我寫的東西很簡單,任何get/set都只是默認值。在過去,當我需要封裝某些東西時,我只是用一個getter/setter來重寫......但我永遠不會這樣做所有我的公共成員...我認爲最好的做法是,你應該爲所有人? – afuzzyllama

+0

@afuzzyllama:是的,這對所有成員都沒有害處......特別是因爲VB.NET可能具有自動屬性,就像C#一樣。 –

+2

VB.NET在2010年有自動實現的屬性。以前的版本不。 – Nick