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

作者: BigLoser (大魯蛇)   2014-12-12 00:08:19
這為溫拿您好,
大魯蛇我很弱,若有講錯,還請版友指正,
首先我想您需要官網的文件,
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"];
}
}
作者: CloudyWing (孤單ㄉ翼)   2014-12-12 00:17:00
括弧那個手殘打錯 XD除了第2點是看原PO一樓回覆我才知道外,其他點都知道至於為什麼要設靜態屬性而非靜態方法我還是不理解大概是有什麼觀念還沒轉過來吧(嘆氣)
作者: BigLoser (大魯蛇)   2014-12-12 00:24:00
為什麼他會是一個方法? KeyName看起來就是一個屬性呀就像是{人類}類別中有一個DNA那,DNA是一個屬性不會是方法,你說對吧? 如果說{跑步}那他就會是一個方法而不是一個屬性,方法和屬性應該滿容易區分的
作者: CloudyWing (孤單ㄉ翼)   2014-12-12 00:27:00
因為我覺得我只是要撈設設定檔的值但我不想一直重複寫這些程式碼所以我把這些撈取設定檔的行為都個別封裝成static method 這些static method再集中放在一個static class管理,我的想法是這樣
作者: BigLoser (大魯蛇)   2014-12-12 00:37:00
這個問題請上一篇回你的ssccg大來回答XD
作者: CloudyWing (孤單ㄉ翼)   2014-12-12 00:56:00
應該說,我的想法是如果我每次都是要從設定檔撈值來用那我會設方法,但如果我是從設定檔撈值存起來則用fields或property,此這案例來說應該歸類成前者
作者: ssccg (23)   2014-12-12 01:03:00
用property的意義就是說這class有個叫KeyName的值其他人只要用就好,不用去想這裡面的值是怎麼生出來的今天實作是撈設定檔,明天不能改成回傳常數?
作者: CloudyWing (孤單ㄉ翼)   2014-12-12 01:08:00
換個方式來說,今天要寫一個和時間有關的工具,其中一個功能是取得現在時間,你們也會寫property?!!!那看來真的是被原有語言觀念影響太大 orz
作者: BigLoser (大魯蛇)   2014-12-12 01:19:00
可能吧,像我主要寫C# 就覺得理所當然..時間阿時間,請問現在的時間是多少呢? (屬性)時間阿時間,可以幫我把這個日期加一天嗎? (方法)

Links booklink

Contact Us: admin [ a t ] ucptt.com