作者BigLoser (Looking for job)
看板C_Sharp
标题Re: [问题] 新手学C#,有关{get;set;}的疑问
时间Fri Dec 12 00:08:19 2014
这为温拿您好,
大鲁蛇我很弱,若有讲错,还请版友指正,
首先我想您需要官网的文件,
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#是世界上最强的语言了
红胶咖咖希希C ◥▁▁▁▁ ◢
麦
其他的应该废除
宝水啡啡嘉 # ◤
██ /-
科
石 脚 嘉 □–□◢◤ 舒
如果各位有兴趣的话,可以现在开始学
本 ▼ㄑ ◢ 服
但是要安装
VisualStudio ▼ㄧ /◣ 特
因为我们只会支援
精英IDE,绝对不会接受
垃圾 ψdohProject ◢ /◣– ◤ /█◣
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 113.61.160.93
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1418314103.A.D1A.html
1F:推 CloudyWing: 括弧那个手残打错 XD 12/12 00:17
既然那个括弧是打错的,那
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
2F:→ CloudyWing: 除了第2点是看原PO一楼回覆我才知道外,其他点都知道 12/12 00:21
3F:→ CloudyWing: 至於为什麽要设静态属性而非静态方法我还是不理解 12/12 00:22
4F:→ CloudyWing: 大概是有什麽观念还没转过来吧(叹气) 12/12 00:23
5F:→ BigLoser: 为什麽他会是一个方法? KeyName看起来就是一个属性呀 12/12 00:24
6F:→ BigLoser: 就像是{人类}类别中有一个DNA那,DNA是一个属性不会是 12/12 00:25
7F:→ BigLoser: 方法,你说对吧? 如果说{跑步}那他就会是一个方法 12/12 00:26
8F:→ BigLoser: 而不是一个属性,方法和属性应该满容易区分的 12/12 00:26
9F:推 CloudyWing: 因为我觉得我只是要捞设设定档的值 12/12 00:27
10F:→ CloudyWing: 但我不想一直重复写这些程式码 12/12 00:29
11F:→ CloudyWing: 所以我把这些捞取设定档的行为都个别封装成 12/12 00:30
12F:→ CloudyWing: static method 这些static method再集中放在一个 12/12 00:31
13F:→ CloudyWing: static class管理,我的想法是这样 12/12 00:31
14F:→ BigLoser: 这个问题请上一篇回你的ssccg大来回答XD 12/12 00:37
15F:推 CloudyWing: 应该说,我的想法是如果我每次都是要从设定档捞值来用 12/12 00:56
16F:→ CloudyWing: 那我会设方法,但如果我是从设定档捞值存起来 12/12 00:57
17F:→ CloudyWing: 则用fields或property,此这案例来说应该归类成前者 12/12 00:59
18F:→ ssccg: 用property的意义就是说这class有个叫KeyName的值 12/12 01:03
19F:→ ssccg: 其他人只要用就好,不用去想这里面的值是怎麽生出来的 12/12 01:04
20F:→ ssccg: 今天实作是捞设定档,明天不能改成回传常数? 12/12 01:05
21F:推 CloudyWing: 换个方式来说,今天要写一个和时间有关的工具,其中一 12/12 01:08
22F:→ CloudyWing: 个功能是取得现在时间,你们也会写property? 12/12 01:09
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
23F:推 CloudyWing: !!!那看来真的是被原有语言观念影响太大 orz 12/12 01:13
24F:→ BigLoser: 可能吧,像我主要写C# 就觉得理所当然.. 12/12 01:19
25F:→ BigLoser: 时间阿时间,请问现在的时间是多少呢? (属性) 12/12 01:19
26F:→ BigLoser: 时间阿时间,可以帮我把这个日期加一天吗? (方法) 12/12 01:19