[問題] 新手學C#,有關{get;set;}的疑問

作者: CloudyWing (孤單ㄉ翼)   2014-12-11 20:04:46
Q1:
一般在寫class的時候,為了避免直接存取member variable
都會將他設為private或是protected
然後提供Get/Set的method來讓其他人存取
後來看到C#提供Property來簡化這步驟,程式碼大概如下:
==================================================
private String Text1 = "";
public String textValue
{
set { Text1 = value; }
get { return Text1; }
}
==================================================
當下看到的想法是這個寫法變得好簡潔
可是當我看到更進一步的簡化時,則開始有疑惑
===================================================
public String Text1 { get; set; }
===================================================
這樣Text1到底應該算是個method還是member variable?
雖然說Text1本身不會存取變數,而是另外將值存取到隱藏(?)的變數
但class本身並沒有對應member variable,Text1也沒有定義對應變數
那Text1是否就等於是變相成為此class的member variable?
然後當你不希望Text1只能get或是只能set時
會發現你只寫get,但是你無法給他初始值,所以沒意義
如果只寫set時,會發現沒有任何人可以存取他
(這部分不確定,有錯請指認)
所以有點疑惑當簡寫到這種程度的時候是否有其意義?
Q2:
今天看程式書時看到他在製作取得appSetting的method時是這樣寫
==========================================================
public static String KeyName() {
get {
return System.Web.Configuration.
WebConfigurationManager.AppSettings["KeyName"];
}
}
===========================================================
當下看到很疑惑的是這只是取得AppSettings的設定
是否有必要特地採用Property的寫法?
感覺就只是變相取一個比較短名稱的method而已
那用傳統的寫法是否會比較適當?
===========================================================
public static String getKeyName() {
return System.Web.Configuration.
WebConfigurationManager.AppSettings["KeyName"];
}
===========================================================
會來提問主要是最近看得書和程式都是這類簡化寫法
總覺得有點走味了,但是由於剛開始學
所以也不知是否真的因某些考量,所以這樣寫比較好
還是單純覺得寫法比較簡短才這樣寫
請前輩們指導一下 Q.Q
作者: Peruheru (還在想)   2014-12-11 20:16:00
第二個問題好像就是第一個問題的延伸第一個問題,那是變數只是他可以分別對讀與寫作不同處理比如說我可以設定{get; private set;}只有內部可以設定這個屬性,對外部來說這就是唯獨屬性我應該要講屬性,怎麼會講變數這樣的寫法比我寫function要分別寫讀跟寫要快多了不好意思,我不太懂理論,只就我自己運用上的感覺來說第二個問題好像就需要更深的講解,只能等懂得人來說了
作者: iterator (rotareti)   2014-12-11 21:17:00
Q1: auto-implemented property, 編譯器會幫你處理至於初始值的問題,在C# 6將可以對auto-property設初始值先拋開所謂"傳統的"的Java寫法,直接從C#的角度來看http://msdn.microsoft.com/en-us/library/ms229006.asx這邊是微軟對於使用 property 的 guideline.
作者: GoalBased (Artificail Intelligence)   2014-12-11 22:04:00
補充樓上的,你每個屬性都要寫get set不是很麻煩嗎?所以微軟讓你有簡短的寫法,編譯器會寫麻煩的地方所以兩種東西是一樣的get的時候你可以給他初值,但簡寫就無法上面這句剛好就是你的Q2另外是個人觀點,我不覺得簡寫會讓程式碼走味除了程式碼容易看(get set加起來才一行)還有就是讓能產出更有效率
作者: iterator (rotareti)   2014-12-11 23:39:00
就說要跳脫所謂的傳統,想想 property 對 C# 物件的意義哪些東西該是 property, 哪些東西應該是 method多少會有些譜
作者: BigLoser (大魯蛇)   2014-12-12 00:13:00
我覺得你不要一直把屬性(property) 和 member var拉上關係,屬性是我們這個類別的"外貌",使用這個類別的人可以改變我們的外貌,所以才會分出Field和Property,因為我們希望可以保留我們這個類別的隱私
作者: ssccg (23)   2014-12-12 00:23:00
auto-implement property可以對get/set分別設存取權限,跟單純的field不一樣,另外即使一開始的確沒有其他邏輯先寫成property,以後要加邏輯時再implement get/set即可如果一開始就直接存取field,到時候就改到死...再來getter/setter的用途不止在給外部存取時的介面而是跟field比起來,可以有機會控管讀寫時的行為例如最常見的在讀寫時發出event再來你說的傳統寫法,C#才沒那種傳統,那是java的傳統吧跟那種把特殊命名的method定義叫property規格,然後用reflection時因為case/底線命名不一出一堆問題比起來C#直接把property定在語言裡,relfection時property直接跟method分開,你不覺得比較好? 那種易出錯的傳統哪邊好?不要一直從實作去想用method/field也一樣還怎樣使用property最大的目的就在表明是個property其實從OO角度來看,我覺得method/property才是介面元素field只是存data的空間,只是有些OO語言沒有提供property
作者: BigLoser (大魯蛇)   2014-12-12 01:17:00
java 、 c++ 都沒有(吧)
作者: ssccg (23)   2014-12-12 01:24:00
就是這兩個沒有,所以有些學過OOP的卻沒property的概念..很多語言有類似的寫法,C#是提供一個把name/getter/setter整合成單一元素的完整支援
作者: uranusjr (←這人是超級笨蛋)   2014-12-13 10:43:00
最重要的就是權限管理, 其他討論都是多的
作者: ssccg (23)   2014-12-18 09:10:00
以OOP來說重點在封裝,不是在權限管理

Links booklink

Contact Us: admin [ a t ] ucptt.com