討論奇妙的VB.NET屬性
VB.NET還是比較常用的,于是我研究了一下VB.NET屬性,在這里拿出來(lái)和大家分享一下,希望對(duì)大家有用。很多人在對(duì)屬性的認(rèn)識(shí)上產(chǎn)生了一些混亂的概念。其實(shí)屬性這個(gè)東西絕非人們想象的那么復(fù)雜。讓我們回到最基礎(chǔ)的概念層次上來(lái)討論屬性:所謂屬性其實(shí)就是暴露了讀/寫(xiě)接口的類(lèi)的內(nèi)部所包含的一塊數(shù)據(jù)。按照這個(gè)定義,你可能會(huì)認(rèn)為你能在類(lèi)中聲明一個(gè)公共變量然后把它稱(chēng)為一個(gè)屬性。當(dāng)然,這種假設(shè)也不是沒(méi)有一點(diǎn)道理,不過(guò),類(lèi)的公共變量所對(duì)應(yīng)的技術(shù)術(shù)語(yǔ)應(yīng)該是field(域)。域和屬性之間的關(guān)鍵差別在于接口的包含性質(zhì)上?,F(xiàn)在暫時(shí)不對(duì)這一差別做具體解釋咱們先明白其語(yǔ)法用途即可,以下介紹VB.NET屬性。
在VB6中,屬性由Let、Get和Set程序來(lái)定義和操作。而在VB.NET中語(yǔ)法就變了。屬性被組織為單個(gè)Property代碼塊,其中針對(duì)屬性的寫(xiě)(Set)和讀(Get)操作設(shè)置了子代碼塊。這一程序起到了類(lèi)的私有變量之上的抽象層作用。大多數(shù)人習(xí)慣于采用類(lèi)似公共變量的方式命名這些私有變量,在它們前面加上小寫(xiě)的前綴字母m或者加上下劃線(xiàn)區(qū)分所關(guān)聯(lián)的屬性(m前綴是VB6中繼承下來(lái)的,意思是:“模塊級(jí)變量”)。舉一個(gè)例子:
- Private _ContactName As String
- Public Property ContactName()
- Get
- Return _ContactName
- End Get
- Set(ByVal Value)
- _ContactName = Value
- End Set
- End Property
我給一個(gè)假定的類(lèi)ContactName創(chuàng)建了一個(gè)屬性。為了支持該屬性,我需要在類(lèi)里設(shè)置一個(gè)變量存儲(chǔ)其實(shí)際值。ContactName私有變量就是完成這一功能的。只要我獲取或者設(shè)置了該屬性,我就等于間接地使用了該值。
那么,為什么這么做就比使用域更好一些呢?主要的原因是,如果采用域,那么就無(wú)法控制寫(xiě)到變量中的數(shù)據(jù)。比方說(shuō),有的人卻偏偏要在整數(shù)域中置入字符串或者給只讀域賦值。在采用屬性的情況下,你可以在Set程序中增加邏輯來(lái)保證賦值的有效性。你甚至可以完全省略Set代碼塊把屬性設(shè)置為只讀。
VB.NET屬性真奇妙
最后,.NET還向我們提供了就被稱(chēng)為屬性的內(nèi)容。如果某個(gè)類(lèi)標(biāo)記為屬性,那么它就被賦予一些特別有意思的專(zhuān)門(mén)功能。比如以下的Serializable屬性。
- <Serializable()>
- Public Class MyClass
- '該類(lèi)可以串行化!
- End Class
把以上的類(lèi)標(biāo)記為屬性之后,不論其處于什么狀態(tài)我都可以獲取其實(shí)例并寫(xiě)出磁盤(pán)。在一些任何時(shí)候,我就可以對(duì)該類(lèi)去串行化,就好象它始終保存在內(nèi)存中一樣。.NET框架提供了大量的屬性,你甚至可以自VB.NET創(chuàng)建屬性。
【編輯推薦】


















