[问题] 新手学C#,有关{get;set;}的疑问

楼主: CloudyWing (孤单ㄉ翼)   2014-12-11 20:04:46
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
作者: Peruheru (还在想)   2014-12-11 20:16:00
第二个问题好像就是第一个问题的延伸第一个问题,那是变量只是他可以分别对读与写作不同处理比如说我可以设定{get; private set;}只有内部可以设定这个属性,对外部来说这就是唯独属性我应该要讲属性,怎么会讲变量这样的写法比我写function要分别写读跟写要快多了不好意思,我不太懂理论,只就我自己运用上的感觉来说第二个问题好像就需要更深的讲解,只能等懂得人来说了
作者: iterator (rotareti)   2014-12-11 21:17:00
Q1: auto-implemented property, 编译器会帮你处理至于初始值的问题,在C# 6将可以对auto-property设初始值先抛开所谓"传统的"的Java写法,直接从C#的角度来看http://msdn.microsoft.com/en-us/library/ms229006.asx这边是微软对于使用 property 的 guideline.
作者: GoalBased (Artificail Intelligence)   2014-12-11 22:04:00
补充楼上的,你每个属性都要写get set不是很麻烦吗?所以微软让你有简短的写法,编译器会写麻烦的地方所以两种东西是一样的get的时候你可以给他初值,但简写就无法上面这句刚好就是你的Q2另外是个人观点,我不觉得简写会让程式码走味除了程式码容易看(get set加起来才一行)还有就是让能产出更有效率
作者: iterator (rotareti)   2014-12-11 23:39:00
就说要跳脱所谓的传统,想想 property 对 C# 物件的意义哪些东西该是 property, 哪些东西应该是 method多少会有些谱
作者: BigLoser (大鲁蛇)   2014-12-12 00:13:00
我觉得你不要一直把属性(property) 和 member var拉上关系,属性是我们这个类别的"外貌",使用这个类别的人可以改变我们的外貌,所以才会分出Field和Property,因为我们希望可以保留我们这个类别的隐私
作者: ssccg (23)   2014-12-12 00:23:00
auto-implement property可以对get/set分别设存取权限,跟单纯的field不一样,另外即使一开始的确没有其他逻辑先写成property,以后要加逻辑时再implement get/set即可如果一开始就直接存取field,到时候就改到死...再来getter/setter的用途不止在给外部存取时的接口而是跟field比起来,可以有机会控管读写时的行为例如最常见的在读写时发出event再来你说的传统写法,C#才没那种传统,那是java的传统吧跟那种把特殊命名的method定义叫property规格,然后用reflection时因为case/底线命名不一出一堆问题比起来C#直接把property定在语言里,relfection时property直接跟method分开,你不觉得比较好? 那种易出错的传统哪边好?不要一直从实作去想用method/field也一样还怎样使用property最大的目的就在表明是个property其实从OO角度来看,我觉得method/property才是接口元素field只是存data的空间,只是有些OO语言没有提供property
作者: BigLoser (大鲁蛇)   2014-12-12 01:17:00
java 、 c++ 都没有(吧)
作者: ssccg (23)   2014-12-12 01:24:00
就是这两个没有,所以有些学过OOP的却没property的概念..很多语言有类似的写法,C#是提供一个把name/getter/setter整合成单一元素的完整支援
作者: uranusjr (←這人是超級笨蛋)   2014-12-13 10:43:00
最重要的就是权限管理, 其他讨论都是多的
作者: ssccg (23)   2014-12-18 09:10:00
以OOP来说重点在封装,不是在权限管理

Links booklink

Contact Us: admin [ a t ] ucptt.com