Getters和Setters应该和不应该做什么

dlr*_*as2 19 getter setter properties

可能重复:
常规问题:何时使用Getter/Setter函数而不是使用Property

我最近对Getters and Setters遇到了很多不同的看法,所以我想我应该把它变成自己的问题.

一个先前的问题我的收到的规定制定者不应该有任何的副作用立即发表评论(后来被删除),和SetProperty方法将是一个更好的选择.

实际上,这似乎也是微软的意见.但是,它们的属性通常会引发事件,例如设置Resized表单WidthHeight属性时.OwenP还指出"你不应该让一个房产抛出异常,房产不应该有副作用,顺序应该无关紧要,房产应该相对快速地返回."

然而,Michael Stum声明在验证setter中的数据时应该抛出异常.如果你的setter没有抛出异常,你怎么能有效地验证数据,因为这个问题的许多答案都表明了这一点

什么时候你需要举办一个活动,比如几乎所有的微软控制公司呢?那么你是不是受到任何订阅你的活动的怜悯?如果他们的处理程序执行大量信息,或者自己抛出错误,那么你的setter会发生什么?

最后,getter中的延迟加载怎么样?这也可能违反以前的准则.

放置在getter或setter中可以接受什么,以及只有accessor方法应该保留什么?

编辑:

来自MSDN中的另一篇文章:

这些getset方法通常与其他方法没有区别.它们可以执行任何程序逻辑,抛出异常,被覆盖,并使用编程语言允许的任何修饰符进行声明.但请注意,属性也可以是静态的.如果属性是静态的,那么getset方法可以做什么有限制.有关详细信息,请参阅编程语言参考

Ste*_*dit 16

我的看法:

  1. 如果预期定位器或吸气剂价格昂贵,请不要将其作为属性,将其作为一种方法.

  2. 如果设置属性会因更改而触发事件,那么这很好.你怎么能让听众收到变化通知?但是,您可能希望提供BeginInit/EndInit对来抑制事件,直到进行所有更改.通常情况下,事件处理程序有责任立即返回,但如果您真的不相信它这样做,那么您可能希望在另一个线程中发出该事件的信号.

  3. 如果设置属性会抛出无效值的异常,那也没关系.当值完全错误时,这是​​发出问题的合理方式.在其他情况下,您设置一组属性,然后调用使用它们执行某些操作的方法,例如建立连接.这将允许在使用属性之前保持验证和错误处理,因此属性不需要抛出任何东西.

  4. 进入房产可能会产生副作用,只要它们不是出乎意料并且无关紧要.这意味着getter中的JIT实例化很好.同样,每当进行更改时为实例设置脏标志就好了,因为它设置了相关属性,例如相同值的不同格式.

  5. 如果做一些事情,而不是仅仅访问一个值,它应该是一个方法.方法是动词,因此创建连接将由OpenConnection()方法完成,而不是Connection属性.Connection属性将用于检索正在使用的连接,或将实例绑定到另一个连接.

编辑 - 添加5,更改2和3