C_Sharp 板


LINE

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 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.35.46.112
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1418299491.A.A9B.html
1F:推 Peruheru: 第二个问题好像就是第一个问题的延伸 12/11 20:16
2F:→ Peruheru: 第一个问题,那是变数只是他可以分别对读与写作不同处理 12/11 20:18
3F:→ Peruheru: 比如说我可以设定{get; private set;} 12/11 20:18
4F:→ Peruheru: 只有内部可以设定这个属性,对外部来说这就是唯独属性 12/11 20:19
5F:→ Peruheru: 我应该要讲属性,怎麽会讲变数 12/11 20:20
6F:→ Peruheru: 这样的写法比我写function要分别写读跟写要快多了 12/11 20:21
7F:→ Peruheru: 不好意思,我不太懂理论,只就我自己运用上的感觉来说 12/11 20:22
8F:→ Peruheru: 第二个问题好像就需要更深的讲解,只能等懂得人来说了 12/11 20:25
9F:→ iterator: Q1: auto-implemented property, 编译器会帮你处理 12/11 21:17
10F:→ iterator: 至於初始值的问题,在C# 6将可以对auto-property设初始值 12/11 21:18
11F:→ iterator: 先抛开所谓"传统的"的Java写法,直接从C#的角度来看 12/11 21:23
13F:→ iterator: 这边是微软对於使用 property 的 guideline. 12/11 21:27
14F:推 GoalBased: 补充楼上的,你每个属性都要写get set不是很麻烦吗? 12/11 22:04
15F:→ GoalBased: 所以微软让你有简短的写法,编译器会写麻烦的地方 12/11 22:05
16F:→ GoalBased: 所以两种东西是一样的 12/11 22:05
17F:推 GoalBased: get的时候你可以给他初值,但简写就无法 12/11 22:10
18F:→ GoalBased: 上面这句刚好就是你的Q2 12/11 22:11
19F:→ GoalBased: 另外是个人观点,我不觉得简写会让程式码走味 12/11 22:12
20F:→ GoalBased: 除了程式码容易看(get set加起来才一行) 12/11 22:12
21F:→ GoalBased: 还有就是让能产出更有效率 12/11 22:12
我发现我讲太多废话,重点有点跑掉 XD 刚看了一楼的唯读的用法,再去查一下,大概懂简写的用意 先回过头来看第一个简写的方式 可以看成把Get / Set的method包成property 利用这个property来存取member variable 以传说OO的这个角度来说,这个简写法绝对没有问题,一大福音 再看看第二个简写法 C#3.0新增的auto-implemented properties 他的作法变成是将原本的Get / Set method和member variable 给包成property 从外部的角度来看,这种没加工的property变相是object的member variable 所以存取property和存取member variable是一样的意思 我的疑问点在此,如果你已经不想管OO不让外部直接存取member variable的原则 那这种缩写法不如定义public member variable就好? 何必多此一举包成property,反而没简写到 所以当初想这种写法好处就应该是设成让外部只能only ready或only write时较好用 (这应该也是这样缩写的重点) 不过我之前在研究怎only ready或only write时 是把set或get省略,所以导致失败(在此感谢一楼前辈告诉我是加上privte) 再来是Q2 结合前面来看,一般会设定property 应该要就是利用property存取member variable 或是连member variable也包成property 但Q2案例应该不属於前两者 比较像是常使用所以包成static method,让下次要使用直接呼叫那类程式码 却因为命名习惯是get开头而被包成property 而实际上包成property似乎也没简写到 那这样的作法是否矫枉过正? 这是我在书上这类状况都是这样写的,所以觉得疑惑 ※ 编辑: CloudyWing (114.35.46.112), 12/11/2014 23:20:09 ※ 编辑: CloudyWing (114.35.46.112), 12/11/2014 23:25:16
22F:→ iterator: 就说要跳脱所谓的传统,想想 property 对 C# 物件的意义 12/11 23:39
23F:→ iterator: 哪些东西该是 property, 哪些东西应该是 method 12/11 23:40
24F:→ iterator: 多少会有些谱 12/11 23:40
意义是指节省程式码? Q2那种状况好像改成property也没省到 Q.Q ※ 编辑: CloudyWing (114.35.46.112), 12/12/2014 00:08:09
25F:推 BigLoser: 我觉得你不要一直把属性(property) 和 member var 12/12 00:13
26F:→ BigLoser: 拉上关系,属性是我们这个类别的"外貌", 12/12 00:14
27F:→ BigLoser: 使用这个类别的人可以改变我们的外貌, 12/12 00:16
28F:→ BigLoser: 所以才会分出Field和Property,因为我们希望可以保留 12/12 00:16
29F:→ BigLoser: 我们这个类别的隐私 12/12 00:17
30F:→ ssccg: auto-implement property可以对get/set分别设存取权限,跟 12/12 00:23
31F:→ ssccg: 单纯的field不一样,另外即使一开始的确没有其他逻辑 12/12 00:24
32F:→ ssccg: 先写成property,以後要加逻辑时再implement get/set即可 12/12 00:24
33F:→ ssccg: 如果一开始就直接存取field,到时候就改到死... 12/12 00:25
34F:→ ssccg: 再来getter/setter的用途不止在给外部存取时的介面 12/12 00:26
35F:→ ssccg: 而是跟field比起来,可以有机会控管读写时的行为 12/12 00:26
36F:→ ssccg: 例如最常见的在读写时发出event 12/12 00:29
37F:→ ssccg: 再来你说的传统写法,C#才没那种传统,那是java的传统吧 12/12 00:30
38F:→ ssccg: 跟那种把特殊命名的method定义叫property规格,然後用 12/12 00:31
39F:→ ssccg: reflection时因为case/底线命名不一出一堆问题比起来 12/12 00:33
40F:→ ssccg: C#直接把property定在语言里,relfection时property直接跟 12/12 00:33
41F:→ ssccg: method分开,你不觉得比较好? 那种易出错的传统哪边好? 12/12 00:36
42F:→ ssccg: 不要一直从实作去想用method/field也一样还怎样 12/12 00:37
43F:→ ssccg: 使用property最大的目的就在表明是个property 12/12 00:38
没说是C#传统阿 只是印象中传统(?)OO是这样 XD 大概了解了,把property当成独立於method和field的object第三个元素 而不要一直把他看成是为了简写Get / Set的存在 是这样的意思吗? ※ 编辑: CloudyWing (114.35.46.112), 12/12/2014 00:44:36
44F:→ ssccg: 其实从OO角度来看,我觉得method/property才是介面元素 12/12 01:11
45F:→ ssccg: field只是存data的空间,只是有些OO语言没有提供property 12/12 01:14
46F:→ BigLoser: java 、 c++ 都没有(吧) 12/12 01:17
我也觉得是介面元素,只是前几天刚看到以为只是个省略写法 今天要细究才发现是property,但property观念非常薄弱 一直有些先入为主的观念导致转不过来 看来从PHP转到ASP.NET要改的观念要改很多 Q.Q ※ 编辑: CloudyWing (114.35.46.112), 12/12/2014 01:23:16
47F:→ ssccg: 就是这两个没有,所以有些学过OOP的却没property的概念.. 12/12 01:24
PHP的OO疑似是学JAVA的所以也没有 也许某些样版有模拟这概念,但前公司没使用 很久以前买的ASP.NET也没提到 最近学ASP.NET一整个觉得好陌生(崩溃) ※ 编辑: CloudyWing (114.35.46.112), 12/12/2014 01:31:52
48F:→ ssccg: 很多语言有类似的写法,C#是提供一个把name/getter/setter 12/12 01:29
49F:→ ssccg: 整合成单一元素的完整支援 12/12 01:33
50F:→ uranusjr: 最重要的就是权限管理, 其他讨论都是多的 12/13 10:43
51F:→ ssccg: 以OOP来说重点在封装,不是在权限管理 12/18 09:10
52F:推 fallingleaf: SO上有现成回答https://tinyurl.com/ybkykagy 10/19 09:30







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP