gpt4 book ai didi

properties - Getter 和 Setter 应该做什么和不应该做什么

转载 作者:行者123 更新时间:2023-12-03 12:54:04 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




11年前关闭。




Possible Duplicate:
Convention question: When do you use a Getter/Setter function rather than using a Property



最近我在 Getters 和 Setters 上遇到了很多不同的意见,所以我想我应该把它变成它自己的问题。

一个 previous question我的一位立即收到了一条评论(后来被删除),声明二传手不应该有任何副作用,还有一个 SetProperty方法会是更好的选择。

确实,这似乎是 Microsoft's opinion也是。但是,它们的属性通常会引发事件,例如 Resized当表单的 WidthHeight属性设置。 OwenP还声明“你不应该让属性抛出异常,属性不应该有副作用,顺序不重要,并且属性应该相对快速地返回。”

然而 Michael Stum声明在 setter 中验证数据时应引发异常。如果您的 setter 没有抛出异常,您如何有效地验证数据,就像 this question 的许多答案一样建议?

当您需要像几乎所有 Microsoft 的 Control 一样发起事件时怎么办?那么,您是否不受订阅您事件的人的摆布?如果他们的处理程序执行大量信息,或者自己抛出错误,你的 setter 会发生什么?

最后, lazy loading 呢?在 setter/getter 中?这也可能违反以前的指导方针。

什么可以放在 getter 或 setter 中,什么应该只保留在访问器方法中?

编辑:

来自另一个 article在 MSDN 中:

The get and set methods are generally no different from other methods. They can perform any program logic, throw exceptions, be overridden, and be declared with any modifiers allowed by the programming language. Note, however, that properties can also be static. If a property is static, there are limitations on what the get and set methods can do. See your programming language reference for details.

最佳答案

我的观点:

  • 如果预计 setter 或 getter 会很昂贵,请不要将其设为属性,而应将其设为方法。
  • 如果设置属性由于更改而触发事件,这很好。您还如何允许听众收到更改通知?但是,您可能希望提供 BeginInit/EndInit 对来抑制事件,直到进行所有更改。通常,事件处理程序有责任迅速返回,但如果您真的不相信它会这样做,那么您可能希望在另一个线程中发出事件信号。
  • 如果设置属性在无效值上引发异常,那也没关系。这是在值完全错误时发出问题信号的合理方式。在其他情况下,您设置一堆属性,然后调用使用它们做某事的方法,例如建立连接。这将允许在使用属性之前推迟验证和错误处理,因此属性不需要抛出任何东西。
  • 访问属性可能会产生副作用,只要它们不是意外且无关紧要。这意味着 getter 中的 JIT 实例化很好。同样,每当进行更改时为实例设置脏标志就可以了,因为它设置了相关属性,例如相同值的不同格式。
  • 如果它做某事而不是仅仅访问一个值,它应该是一个方法。方法是动词,因此创建连接将由 OpenConnection() 方法完成,而不是 Connection 属性。 Connection 属性将用于检索正在使用的连接,或将实例绑定(bind)到另一个连接。

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

    关于properties - Getter 和 Setter 应该做什么和不应该做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908415/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com