由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 请教C#里property的意义
相关主题
Getter and setter methods are evil为什么java要用setter和getter
golang里面 函数received type关于指针和非指针有什么难的。有没有根据 model 类自动生成 html form的工具?
子类的assignment operator 怎么访问父类的private member大家都用那跟手指敲 - + = [ ] ;
C++: friend functionWho can help explain setter and getter?
c++ 设计问题求助scala的ide版本号已经上3冲4了
请教一个C++问题学scala发现一个有趣现象
问一个简单的:setter 和getter有什么用处?有人用lombok吗?
goodbug vs neverlearn老年工程师转行遇到下马威
相关话题的讨论汇总
话题: money话题: balance话题: public话题: property话题: c#
进入Programming版参与讨论
1 (共1页)
c*****s
发帖数: 49
1
在学C#,刚接触property这个概念,有点迷惑。下面这段摘自书中,大意是提醒哪些情
况可以用,哪些情况不该用。觉得好像一个public的property如果有both get & set
accessor的话应该保证这个数据本身supposed to be readable and writable.我的问
题是,如果这样,为什么不直接用public data member? 感觉好像property只在
readonly(如下面balance例子)或writeonly时好用(一个用accessor,另一个用普通
method)。这个理解对吗?
多谢指教!
class BankAccount
{ ...
public money Balance
{
get { ... }
set { ... }
}
private money balance;
}
This is a poor design. It fails to represent the functionality required when
withdrawing money from and depositing money into an account. (If you know
of a bank that allows you to change the balance of your account directly
without depositing money, please let me know!) When you're programming, try
to express the problem you are solving in the solution and don't get lost in
a mass of low-level syntax:
class BankAccount
{ ...
public money Balance
{
get { ... }
}
public void Deposit(money amount) { ... }
public bool Withdraw(money amount) { ... }
private money balance;
}
l********a
发帖数: 1154
2
私有成员是做数据隐藏用的,外部类只能看到你提供的接口,无法(或者不用)了解类内部的具体数据结构.
不过我从来都是public member,估计要是在公司做,会有这些要求吧
g*****g
发帖数: 34805
3
对一个简单独立纯setter/getter的property来说,跟public member
并没有什么不同。问题在于未来不可预期。对于一个外部类来说,不做
encapsulation将来存在重构的风险。举两个简单的例子。
1. 你有一个String。你某天发现这个String有时候有white space需要trim。
用setter/getter,没有问题,可以在setter里面trim了。所有外部调用
setter/getter的类都不需要改动。反之,当你直接用public member的时候,
你要吗在所有引用的地方trim,要吗重新回到setter/getter。无论哪种
做法你改变的都是N个类,而不是一个。如果这是公共API,有不受你控制的
第三方的源码调用这个类,你直接就破坏了接口。
2. 你有两个变量a 和b,刚开始独立,后来突然来个要求a必须是b的2倍。
有getter/setter,不是问题。没有,结果可以想见。
一些函数语言如Scala,可以做到成员和函数的外部调用在语法上没有区别,
未来重构不是问题,这是其可以把成员确省成public的原因。我不知道C#
现在能否做到这个,Java是不行的。现代的编辑器,可以把从setter/getter
到equals/hashCode直接生成了,所以对我来说并不麻烦。

【在 c*****s 的大作中提到】
: 在学C#,刚接触property这个概念,有点迷惑。下面这段摘自书中,大意是提醒哪些情
: 况可以用,哪些情况不该用。觉得好像一个public的property如果有both get & set
: accessor的话应该保证这个数据本身supposed to be readable and writable.我的问
: 题是,如果这样,为什么不直接用public data member? 感觉好像property只在
: readonly(如下面balance例子)或writeonly时好用(一个用accessor,另一个用普通
: method)。这个理解对吗?
: 多谢指教!
: class BankAccount
: { ...
: public money Balance

s***o
发帖数: 2191
4
The given sample seems more about design patterns than the differences
between properties and fields.
Differences:
1. You can add custom logic within get/set block of a property.
2. You can do databinding with properties, but not with public fields.
3. Reflection works differently. (couldn't remember why properties work
better with reflection ...)
4. ...

【在 c*****s 的大作中提到】
: 在学C#,刚接触property这个概念,有点迷惑。下面这段摘自书中,大意是提醒哪些情
: 况可以用,哪些情况不该用。觉得好像一个public的property如果有both get & set
: accessor的话应该保证这个数据本身supposed to be readable and writable.我的问
: 题是,如果这样,为什么不直接用public data member? 感觉好像property只在
: readonly(如下面balance例子)或writeonly时好用(一个用accessor,另一个用普通
: method)。这个理解对吗?
: 多谢指教!
: class BankAccount
: { ...
: public money Balance

c*****s
发帖数: 49
5
非常感谢各位的回答。
我原来最大的疑惑其实就是没有意识到stdio说的第一点,也就是goodbug举的两个例子
(书上的例子就是简单的把field的值传给accessor或反之)。stdio的2,3两点暂时还
看不懂,以后学完了再回来复习。非常感谢!
1 (共1页)
进入Programming版参与讨论
相关主题
老年工程师转行遇到下马威c++ 设计问题求助
问个Python getter setter的问题请教一个C++问题
有没有办法让一个类的变量只读,不是const?问一个简单的:setter 和getter有什么用处?
OOP里面的Object其实是actorgoodbug vs neverlearn
Getter and setter methods are evil为什么java要用setter和getter
golang里面 函数received type关于指针和非指针有什么难的。有没有根据 model 类自动生成 html form的工具?
子类的assignment operator 怎么访问父类的private member大家都用那跟手指敲 - + = [ ] ;
C++: friend functionWho can help explain setter and getter?
相关话题的讨论汇总
话题: money话题: balance话题: public话题: property话题: c#