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

看板C_Sharp (C#)作者 (Looking for job)時間10年前 (2014/12/12 00:08), 10年前編輯推噓5(5021)
留言26則, 3人參與, 最新討論串2/5 (看更多)
這為溫拿您好, 大魯蛇我很弱,若有講錯,還請版友指正, 首先我想您需要官網的文件, http://msdn.microsoft.com/zh-tw/library/67ef8sbd.aspx 以下例子取自官網, public class CalendarEntry { //所以我們先定義這個東西叫做Field(欄位),也就是你說的member variable private DateTime date; //這個東西叫做Property(屬性) public DateTime Date { get { return date; } set { date = value; } } } 接下來看一下,屬性概觀: 1. 屬性讓類別能夠在隱藏實作或驗證程式碼的同時,以公開的方式取得並設定值。 2. get 屬性存取子是用來傳回屬性值,而 set 存取子是用來指定新值。 這些存取子可能具有不同的存取層級。 3. value 關鍵字的用途是定義由 set 存取子所指定的值。 4. 沒有實作 set 存取子的屬性就是唯讀的。 5. 針對不需要自訂存取子程式碼的簡單屬性,請考慮使用自動實作的屬性。 關於自動實作的屬性: 在 C# 3.0 與以後的版本,自動實作屬性讓屬性宣告更為簡明,而且在屬性的存取子 (Accessor) 中也不需要額外的邏輯。 這些存取子也可以讓用戶端程式碼建立物件。 當您宣告如下列範例所示的屬性時,編譯器便會建立私用 (Private) 的匿名支援欄位 ,讓您只能透過屬性的 get 和 set 存取子來進行存取。 class Customer { // Auto-Impl Properties for trivial get and set public double TotalPurchases { get; set; } public string Name { get; set; } public int CustomerID { get; set; } // Constructor public Customer(double purchases, string name, int ID) { TotalPurchases = purchases; Name = name; CustomerID = ID; } // Methods public string GetContactInfo() {return "ContactInfo";} public string GetTransactionHistory() {return "History";} } 補充: 對於只是封裝一組值 (資料) 與只有少數或沒有任何行為的小型類別或結構, 則建議將 set 存取子宣告為 private,以便將物件設為不可變的。 // Read-only properties. public string Name { get; private set; } public string Address { get; private set; } 之後我看了幾個官網上的範例,似乎沒有你說的這種寫法, public static String KeyName() { get { return System.Web.Configuration. WebConfigurationManager.AppSettings["KeyName"]; } } 我覺得應該是這樣才對(拿掉那個括號),讓他為靜態屬性,而非靜態方法。 public static String KeyName { get { return System.Web.Configuration. WebConfigurationManager.AppSettings["KeyName"]; } } -- 我覺得C#是世界上最強的語言了 紅膠咖咖希希▁▁▁▁ 其他的應該廢除 寶水啡啡嘉 ██ - □–□ 如果各位有興趣的話,可以現在開始學 但是要安裝VisualStudio       因為我們只會支援精英IDE,絕對不會接受垃圾 ψdohProject /◣– /█◣ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 113.61.160.93 ※ 文章網址: http://www.ptt.cc/bbs/C_Sharp/M.1418314103.A.D1A.html

12/12 00:17, , 1F
括弧那個手殘打錯 XD
12/12 00:17, 1F
既然那個括弧是打錯的,那 public static String KeyName { get { return System.Web.Configuration. WebConfigurationManager.AppSettings["KeyName"]; } } 就是屬於這個類別的唯讀靜態屬性, 那我想這個倒是沒有甚麼問題,不過可能你是想問說他寫成這樣也沒有簡寫阿 的確,這個時候回頭看我文章上面的 5. 針對不需要自訂存取子程式碼的簡單屬性,請考慮使用自動實作的屬性。 {set;get;} 是用在簡單屬性的狀況下,如果你要做驗證如, public int Age { get { return age; } set { if(value >= 0) { age = value; } else throw new ArgumentOutOfRangeException(); } } 這種狀況就不能簡寫了。 ※ 編輯: BigLoser (113.61.160.93), 12/12/2014 00:23:38

12/12 00:21, , 2F
除了第2點是看原PO一樓回覆我才知道外,其他點都知道
12/12 00:21, 2F

12/12 00:22, , 3F
至於為什麼要設靜態屬性而非靜態方法我還是不理解
12/12 00:22, 3F

12/12 00:23, , 4F
大概是有什麼觀念還沒轉過來吧(嘆氣)
12/12 00:23, 4F

12/12 00:24, , 5F
為什麼他會是一個方法? KeyName看起來就是一個屬性呀
12/12 00:24, 5F

12/12 00:25, , 6F
就像是{人類}類別中有一個DNA那,DNA是一個屬性不會是
12/12 00:25, 6F

12/12 00:26, , 7F
方法,你說對吧? 如果說{跑步}那他就會是一個方法
12/12 00:26, 7F

12/12 00:26, , 8F
而不是一個屬性,方法和屬性應該滿容易區分的
12/12 00:26, 8F

12/12 00:27, , 9F
因為我覺得我只是要撈設設定檔的值
12/12 00:27, 9F

12/12 00:29, , 10F
但我不想一直重複寫這些程式碼
12/12 00:29, 10F

12/12 00:30, , 11F
所以我把這些撈取設定檔的行為都個別封裝成
12/12 00:30, 11F

12/12 00:31, , 12F
static method 這些static method再集中放在一個
12/12 00:31, 12F

12/12 00:31, , 13F
static class管理,我的想法是這樣
12/12 00:31, 13F

12/12 00:37, , 14F
這個問題請上一篇回你的ssccg大來回答XD
12/12 00:37, 14F

12/12 00:56, , 15F
應該說,我的想法是如果我每次都是要從設定檔撈值來用
12/12 00:56, 15F

12/12 00:57, , 16F
那我會設方法,但如果我是從設定檔撈值存起來
12/12 00:57, 16F

12/12 00:59, , 17F
則用fields或property,此這案例來說應該歸類成前者
12/12 00:59, 17F

12/12 01:03, , 18F
用property的意義就是說這class有個叫KeyName的值
12/12 01:03, 18F

12/12 01:04, , 19F
其他人只要用就好,不用去想這裡面的值是怎麼生出來的
12/12 01:04, 19F

12/12 01:05, , 20F
今天實作是撈設定檔,明天不能改成回傳常數?
12/12 01:05, 20F

12/12 01:08, , 21F
換個方式來說,今天要寫一個和時間有關的工具,其中一
12/12 01:08, 21F

12/12 01:09, , 22F
個功能是取得現在時間,你們也會寫property?
12/12 01:09, 22F
http://msdn.microsoft.com/zh-tw/library/system.datetime.now%28v=vs.110%29.aspx public static DateTime Now { get; } DateTime saveNow = DateTime.Now; ※ 編輯: BigLoser (113.61.160.93), 12/12/2014 01:10:09

12/12 01:13, , 23F
!!!那看來真的是被原有語言觀念影響太大 orz
12/12 01:13, 23F

12/12 01:19, , 24F
可能吧,像我主要寫C# 就覺得理所當然..
12/12 01:19, 24F

12/12 01:19, , 25F
時間阿時間,請問現在的時間是多少呢? (屬性)
12/12 01:19, 25F

12/12 01:19, , 26F
時間阿時間,可以幫我把這個日期加一天嗎? (方法)
12/12 01:19, 26F
文章代碼(AID): #1KYS5tqQ (C_Sharp)
文章代碼(AID): #1KYS5tqQ (C_Sharp)