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两点暂时还
看不懂,以后学完了再回来复习。非常感谢! |
|