何时在C#中使用get和set属性

我们什么时候应该在C#中使用get和set属性?

根据MSDN上的财产使用指南 :

  • 当成员是逻辑数据成员时,请使用属性。 在以下成员声明中,Name是属性,因为它是类的逻辑成员。

  • 在以下时间使用方法:

    • 该操作是转换,例如Object.ToString
    • 操作非常昂贵,您希望与用户通信他们应该考虑缓存结果。
    • 使用get访问器获取属性值会产生可观察到的副作用。
    • 连续两次调用该成员会产生不同的结果。
    • 执行顺序很重要。 请注意,应该能够以任何顺序设置和检索类型的属性。
    • 该成员是静态的,但返回一个可以更改的值。
    • 该成员返回一个数组。 返回数组的属性可能会产生误导。 通常需要返回内部数组的副本,以便用户无法更改内部状态。 这与用户可以轻易地认为它是索引属性的事实相结合,导致代码效率低下。 在下面的代码示例中,每次对Methods属性的调用都会创建数组的副本。 结果,将在以下循环中创建2n + 1个arrays副本。

如果您决定需要获取和设置方法,那么属性可能就是您正在寻找的。 关于为什么你愿意以及为什么你不想使用属性进行讨论,请查看Jon Skeet的Why Properties Matter 。

使用属性而不仅仅暴露内部类数据的一个很好的理由显然是为了保护这些数据。 您可以控制各个属性的访问权限以及validation正在设置的数据。 您还可以实现计算的属性来计算值,这与您的类用户的任何其他属性没有什么不同。

为什么要使用属性而不是Get / Set方法有两个独立的(广义上说)原因:

  1. 你想要一个字段的简洁,但希望授予对“outside”的只读访问权限,同时对“inside”进行readwrite-access。
  2. 你想要一个领域的简洁和内涵,同时秘密地能够强制或操纵引擎盖下的东西,例如:
    1. 要求在一定范围内的值(在设定期间)。
    2. 自动清理或夹紧某些值(在设定期间)。
    3. 更新(或推迟更新)其他相关数据(在设置期间)。
    4. 避免对该字段所需的完整计算,直到实际使用该字段(在获取期间)。
    5. 否则你需要在方法中放置其他任何东西,但如果外界仍将其视为一个字段,则更愿意。