最近我在 Getters 和 Setters 上遇到了很多不同的意见,所以我想我应该把它变成它自己的问题。
我之前的一个问题收到了立即评论(后来被删除),指出 setter 不应该有任何副作用,并且SetProperty
方法将是更好的选择。
事实上,这似乎也是微软的观点。但是,它们的属性通常会引发事件,例如设置Resized
表单Width
或Height
属性时。OwenP还声明“你不应该让属性抛出异常,属性不应该有副作用,顺序不重要,并且属性应该相对快速地返回。”
然而Michael Stum指出,在 setter 中验证数据时应该抛出异常。如果您的设置器没有抛出异常,您如何有效地验证数据,正如这个问题的许多答案所暗示的那样?
当您需要像几乎所有 Microsoft 的 Control 一样发起事件时怎么办?那么,您是否不受订阅您活动的人的摆布?如果他们的处理程序执行大量信息,或者自己抛出错误,你的 setter 会发生什么?
最后,getter 中的延迟加载怎么样?这也可能违反以前的指导方针。
什么可以放在 getter 或 setter 中,什么应该只保留在访问器方法中?
编辑:
来自MSDN 中的另一篇文章:
和方法一般与其他方法没有区别
get
。set
它们可以执行任何程序逻辑、抛出异常、被覆盖以及使用编程语言允许的任何修饰符进行声明。但是请注意,属性也可以是静态的。get
如果一个属性是静态的,那么和set
方法可以做什么是有限制的。有关详细信息,请参阅您的编程语言参考。