1. 程式人生 > >c#欄位,屬性get和set精解

c#欄位,屬性get和set精解

在講解get和set訪問器之前,為了更方便理解,先講解一個例子(不想看例子的可以直接跳到文章正式部分,這裡照顧下新手,是不是很暖?哈哈)
今天做專案的時候,在建立房間介面有一個底分的選項,要求底分的範圍在1-20之間。這裡我另外建立了一個練習的專案,面板如下圖:
在這裡插入圖片描述
這裡我寫了一個名為 “GetSetTest” 的指令碼,聲明瞭一個底分的變數 cellScore,和點選 加 減 按鈕後的顯示底分的Label,因為是測試,這裡按鈕就用了掛載的方式來執行相應的方法。詳細程式碼如下:
在這裡插入圖片描述
當點選加號按鈕時(因為用csdn比較少,還不會弄動態圖,週末了學習下,不過底分的確最小1,最大20)
在這裡插入圖片描述
如果僅僅是為了實現功能而言,這樣寫也完全沒問題,但如果從開發專案的程式碼安全形度來考慮,這樣寫是肯定不行的。接著進入正題,專案裡我是這樣寫的,宣告一個私有欄位 cellScore,對該欄位進行屬性的封裝(c#在定義類時,通常要把類中宣告的物件封裝起來,使得外界不能訪問這個屬性。)。詳細程式碼如下:
在這裡插入圖片描述


在這裡插入圖片描述
這樣寫也能實現底分的取值範圍是1~20之間,實現了同樣的功能,這樣寫卻更能保證程式碼的安全性(寫的多了後,就會慢慢改善,起初只是為實現功能而寫程式碼,後面就不僅僅是實現功能的問題了,至於有什麼,工作中體會吧,此處省略一萬字……)

接下來是文章正式部分
1:什麼是get,set屬性訪問器?
學習過C#語法的屬性的應該都知道,我們首先要和get,set訪問器打交道。
英文理解:get就是獲得什麼什麼,而get是設定什麼什麼。
官方定義:get是讀取屬性時進行的操作,set是設定屬性時進行的操作。定義一個屬性如果只有get,這個屬性就是隻讀的。同樣,只有set,屬性就是隻寫的。
(只讀,只寫是什麼意思,應該沒有人不會吧?算了,這裡簡單解釋一下吧,
我們定義一個string name的欄位;
只寫

:就是你為name欄位賦值,例如 name=“程式人生道可道”,如果沒有set訪問器,你是不能為name賦值的(當然,只寫的屬性我覺的意義不是很大)。
只讀:比如你想在控制檯列印name的值,就要先獲取(get)到name的值,如果沒有get訪問器,你是不能在控制檯列印name的值的。很容易理解吧,嘿嘿)

我們宣告一個欄位的時候,明明自己沒有設定get,set訪問器,但為什麼還能為其賦值並讀取該值呢?因為預設情況下,如果不特別說明,系統會預設該欄位既能讀,也能寫,這點系統底層已經為我們進行了封裝。下面兩行程式碼是相同的。
圖片1:
在這裡插入圖片描述
圖片2
在這裡插入圖片描述
上述程式碼中如果去掉set部分,則外界只能讀取cellScore的值,如果去掉get部分,則只能給cellScore賦值。這樣就可以控制外界對私有屬性name的訪問許可權了,這種寫法是C#的一個特性。

接下來我們通過一些程式碼例項來了解一下get和get訪問器(Bank:銀行,money:錢)
在這裡插入圖片描述
我們可以打個生動的比方:
Money屬性就像銀行裡的自動存取款機,你看不見裡面的money,但你能用set(存錢),用get(取錢)。
money是一個私有欄位,是封裝在類中的,類以外的程式不能直接訪問的,類的set和get成員是外部程式訪問類內部屬性的唯一方法。
就像你去銀行取錢,你不能直接從銀行的保險櫃裡拿到錢,而是銀行營業人員把錢取出來給你的。
那我們設定了Money屬性,怎麼使用呢?
在這裡插入圖片描述
這裡我分別設定斷點在get,set訪問器中,點選下圖所示按鈕,把vs的斷點除錯附加到u3d中,
在這裡插入圖片描述
在Start函式裡呼叫UseMoney();如下圖:
在這裡插入圖片描述
執行u3d……如下圖
在這裡插入圖片描述
當呼叫UseMoney()函式時,在為bank.Money賦值等於15時程式會停下
按下F11逐語句執行程式
在這裡插入圖片描述
可見,當執行程式碼 bank.Money = 15;時,就會進入屬性中的set訪問器。
同理:把 bank.Money的值賦給 a 變數的時候,會進入到屬性中的get訪問器
在這裡插入圖片描述
在這裡插入圖片描述
當然,這個是get和set訪問器最基本的應用。

但是我們為什麼要用get和set訪問器呢??
通過get和set對公有變數Money進行讀寫操作,實際就是間接更改money私有變數的值,那既然如此。為何不設money為public,讓例項直接對money進行讀寫操作呢?我們是不是在多此一舉呢?
其實,我當初剛接觸get和set也不是很理解,並不是說他們的含義難理解,而是為什麼要用?為何不直接用個public的欄位變數來代替呢?(你們是不是也有過這疑問呢?)

接下來我就來說明下,為什麼要用這對訪問器。
理解一:用get和set能讓賦值和取值增加限制
在這裡插入圖片描述
這樣的話,我們是永遠無法給Money屬性賦值負的金錢了!
其實這種應用在實際專案中,屬性設定非常常見!(比如我在專案中的底分)。
如果在set訪問器中設定這個屬性的一些特性,比如說不能為空,長度大小,必須為數字,各類正則表示式等等,然後丟擲異常,表示層再來接受,這樣就可以少寫很多驗證程式了。

理解二:封裝性、安全性、完整性
這個說起來就太多了,新手把我上面講解的搞懂,做基本開發還是沒問題的。這三個特性,等我整理好手頭資料再詳細講解一下。

PS:昨天寫的這篇部落格,但是時間不太夠,感覺匆忙寫一個大家再看不懂,還不如整理好再發。操碎了我這顆熾熱的心啊。堅持寫了一個月的部落格了,還是沒人給評論和轉載,看來還需要加倍努力啊。寫部落格挺不容易的,不能有錯別字,這樣寫好不好,註釋別人可以看懂嗎等等都需要考慮,不過,我現在慢慢的喜歡上寫部落格了,每天進步一點點,相信你我都會成為我們現在口中羨慕的“大神”,大家一起加油吧!!!