【发布时间】:2011-02-23 21:42:04
【问题描述】:
可能重复:
Convention question: When do you use a Getter/Setter function rather than using a Property
我最近在 Getter 和 Setter 上遇到了很多不同的意见,所以我想我应该把它变成自己的问题。
我的一个previous question 立即收到了一条评论(后来被删除),指出setter 不应该有任何副作用,SetProperty 方法会是更好的选择。
确实,这似乎也是Microsoft's opinion。但是,它们的属性通常会引发事件,例如当设置了表单的Width 或Height 属性时,会引发Resized 事件。 OwenP 还声明“你不应该让属性抛出异常,属性不应该有副作用,顺序不重要,并且属性应该相对快速地返回。”
然而Michael Stum 声明在 setter 中验证数据时应该抛出异常。如果您的 setter 没有抛出异常,您如何有效地验证数据,正如this question 的许多答案所建议的那样?
当您需要引发事件时怎么办,就像几乎所有 Microsoft 的 Control 所做的那样?那么,您是否不受订阅您活动的人的摆布?如果他们的处理程序执行大量信息,或者自己抛出错误,你的 setter 会发生什么?
最后,getter 中的lazy loading 呢?这也可能违反以前的准则。
什么可以放在 getter 或 setter 中,什么应该只保留在访问器方法中?
编辑:
来自 MSDN 中的另一个 article:
get和set方法通常与其他方法没有区别。它们可以执行任何程序逻辑、抛出异常、被覆盖以及使用编程语言允许的任何修饰符进行声明。但是请注意,属性也可以是静态的。如果属性是静态的,则get和set方法可以做什么是有限制的。有关详细信息,请参阅您的编程语言参考。
【问题讨论】:
-
我阅读了那个问题、答案,甚至在我自己的问题中链接到它。我没有看到任何关于引发事件的信息,我认为这值得不同的答案。
-
@Rowland:我认为它已经足够具体了。
-
谁投票支持将此迁移到超级用户?
-
它与许多其他问题有关,但不是完全重复,因为它涵盖了新领域。
-
我确实找到的其他问题的数量,我也链接了,这样人们就可以看到我认为没有决定性的信息,而不仅仅是将我链接到问题我已经阅读或将其作为副本关闭。显然我只是让他们的工作更轻松。
标签: properties setter getter