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