C 基礎 屬性訪問器 (accessors)

2021-10-03 00:15:09 字數 3585 閱讀 4112

屬性(property)是類(class)、結構(structure)和介面(inte***ce)的命名(named)成員。類或結構中的成員變數或方法稱為域(field)。屬性(property)是域(field)的擴充套件,且可使用相同的語法來訪問。它們使用訪問器(accessors)讓私有域的值可被讀寫或操作。

首先搞清楚get和set有什麼用,在物件導向程式設計裡面,有的類的資料是私有的,是封裝起來的,所以為了讀取寫入對應的私有資料,c#採用了關鍵字get和set,其中get負責通過公共方法讀取私有資料set負責通過public方法寫入private資料,但這兩種用法應該並不絕對,我見過在get裡面進行寫入操作的。

我們在學習c#語法的屬性時,都要首先和get,set訪問器打交道,從英文的字面意思上理解,get應該就是獲得什麼什麼,而set應該是設定什麼什麼,那我們看一下,官方是怎麼定義這對訪問器的:get是讀取屬性時進行的操作,set是設定屬性時進行的操作。定義乙個屬性如果只有get,這個屬性就是唯讀的。同樣,只有set,屬性就是只寫的,當然只寫的屬性我覺的意義不是很大。

屬性(property)不會確定儲存位置。相反,它們具有可讀寫或計算它們值的訪問器(accessors)

例如,有乙個名為 student 的類,帶有 age、name 和 code 的私有域。我們不能在類的範圍以外直接訪問這些域,但是我們可以擁有訪問這些私有域的屬性。

在程式中經常碰到get、set,不甚明白,在網上查詢時也說的迷迷糊糊,所以整理下,以學的明白透徹點。

有兩個類person:    

publicclassperson

publicstring name;

publicclassperson

publicstring name

第乙個型別的name屬性未封裝,其name屬性直接通過public關鍵字暴露給系統中的其他類了,而第二個型別的name屬性通過get set關鍵字進行了封裝,get和set分別對應的是可讀和可寫,相當於如下**:

privatestring name;

publicstring name

get

set

簡單說下區別吧:當例項化第乙個 「 person 」 這個類時,系統在分配記憶體空間時對 name 屬性直接分配記憶體,之後對 name 屬性的操作也是直接操作記憶體中 name 屬性所在的這個塊;而當例項化第二個「人」型別時,系統會先分配乙個叫 name 的private私有的記憶體空間(此處的 name 對於類的內部使用,name 對於外部操作使用,要有所區分),之後的讀與寫的操作都是通過 name 這個public的類似於指標的東西來關聯 name 進行,以此達到封裝的目的,並且通過getset關鍵字也可以控制可讀還是可寫。建議用後者,封裝的好處可以參考相關文件,不再累述了~

至於get和set的作用,除了控制讀寫之外還有其他的作用,舉個簡單的例子,比如說當我給name賦值的時候想要先進行一些邏輯判斷,就可以這樣:

private string name;

public string name

get

set 

再舉例說明下:假設類是一銀行,既能存錢也能取錢

class bank

//set訪問器,將我們打入的值賦給私有變數money

set

}  }

money 就像銀行裡的自動取款機,你看不見裡面的money,但你能用set(存錢),用get(取錢)。

money是乙個私有字段,是封裝在類中的,類以外的程式不能直接訪問的。c#中get、set用法中,類的set和get成員是外部程式訪問類內部屬性的唯一方法,就像你去銀行取錢,你不能直接從銀行的保險櫃裡拿錢,而是銀行營業人員把錢取出來給你的。

我們設定了money屬性,怎麼使用呢??

class program

}細心的朋友可以發現當我們設定斷點在set訪問的中,執行** bank.money = 15;時,就會進入我們屬性中的set訪問器了。

以上就是我們的set和get訪問器的最基本的應用了。

但是我們為什麼要用get和set訪問器呢??

通過get和set對公有變數money進行讀寫操作,實際就是間接更改money私有變數的值,那既然如此。為何不設money為public,讓例項直接對money進行讀寫操作呢?我們是不是在多此一舉呢?

其實,我當初剛接觸get和set就很理解,並不是說他們的含義難理解,而是為什麼要用?為何不直接用個public的字段變數來代替呢?

理解一:用了get和set能讓賦值和取值增加限制

class bank

//set訪問器,將我們打入的值賦給私有變數money,並且加了限制,不能存負的

setelse

}}        

}這樣的話,我們是永遠無法給money屬性賦值負的金錢了!

其實這種應用才是我們的實際的專案中,屬性設定中非常常見!例:

publicstringapplystaff

setthis.applystaff = value;}}

publicstring billname

setelse if (value.length > 40)

else}}

如果在set訪問器中設定這個屬性的一些特性,比如說不能為空,長度大小,必須為數字,各類正規表示式等等,然後丟擲異常,表示層再來接受,這樣就可以少寫很多驗證程式了。

屬性在呼叫者看來就像乙個普通的變數,但作為類的設計者,你可以利用屬性來隱藏你類中的一些字段,使外界只能通過屬性來訪問你的字段,你可以通過屬性來限制外界對你的字段的訪問,就利用get、set。如果想讓使用者隨意訪問你的字段,那麼就實現get、set;如果只想讓使用者讀取字段,就只實現get;若只想讓使用者寫字段就只實現set。同時還可以在set和get中對使用者傳遞的值進行一些驗證工作,以確保你的字段將含有正確的值。

private int a;

public int index

get

set

可看出,get、set用法中

一則是隱藏元件或類內部的真實成員;

二是用來建立約束的,比如,實現「有我沒你」這種約束;

三是用來響應屬性變化事件,當屬性變化是做某事,只要寫在set方法裡就行。

當你想讀出或寫入屬性的值時,訪問標誌限定了被實現的語句。用於讀出屬性的值的訪問標誌記為關鍵字get,而要修改屬性的值的讀寫符標誌記為set。

C 屬性訪問器

屬性定義 public class a public class b set 當我們例項化a時,系統在為例項化的物件分配記憶體空間時,會將name欄位的記憶體空間宣告為公有的。這意味著之後對name欄位的所有操作,都是直接操作記憶體空間中的name欄位 當我們例項化b時,系統會先將name的記憶體空...

屬性訪問器

synthesize result 表示建立該屬性的訪問器,這樣就可以直接訪問result屬性。在沒有新增屬性訪問器的時候,在main中這樣實現 myclass myclass myclass alloc init myclass setresult hello myclass shixian 新增...

關於訪問器屬性

要修改屬性預設的特性,必須使用ecamscript 5的 object.defineproperty 方法。例如 var person object.defineproperty person,name console.log person.name tom person.name join con...