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

7

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


2
http://www.csharp-station.com/Tutorials/Lesson10.aspx - Robert Harvey
user544079 - 我相信你来自Java背景。Cody的答案总结了C#的方法。 - Pradeep
3个回答

7

属性 可能是您需要获取和设置方法的方式。如果您想知道为什么要使用属性以及不使用属性的原因,请参阅Jon Skeet的 Why Properties Matter

与仅公开内部类数据相比,使用属性的一个很好的理由显然是保护这些数据。您可以控制对各个属性的访问,并验证正在设置的数据。您还可以实现计算属性来计算值,对于您类的用户来说,这与任何其他属性没有区别。


1
属性是指操作者的意思。 - Robert Harvey
请注意,您无法创建带有参数的属性,因此在这种情况下,您可能需要一个Get方法,而不是具有getter的属性。 - Merlyn Morgan-Graham
@Robert 我现在明白了,我添加了第二段来回答那个具体的问题。 - Cody

2
根据MSDN上的属性使用指南
  • 当成员是一个逻辑数据成员时,请使用属性。在以下成员声明中,Name是一个属性,因为它是类的逻辑成员。
  • 当:
    • 操作是转换,例如Object.ToString时,请使用方法。
    • 操作足够昂贵,您希望向用户传达他们应该考虑缓存结果时,请使用方法。
    • 使用get访问器获取属性值将具有可观察的副作用时,请使用方法。
    • 连续两次调用成员会产生不同结果时,请使用方法。
    • 执行顺序很重要。请注意,类型的属性应该能够以任何顺序设置和检索。
    • 成员是静态的,但返回可以更改的值时,请使用方法。
    • 成员返回数组。返回数组的属性可能非常误导人。通常需要返回内部数组的副本,以便用户无法更改内部状态。这个问题再加上用户很容易假设它是一个索引属性,会导致低效的代码。在以下代码示例中,每次调用Methods属性都会创建一个数组副本。因此,在下面的循环中将创建2n+1个数组副本。

1
我理解属性,但不理解这个答案...我发现Cody的回答中提到的Jon Skeet更易读。 - KMC
@KMC 我同意,Skeet先生比普通的MSDN页面要好得多,他是一个更好的教师/沟通者。 - Cameron MacFarland

0

使用属性而不是 Get/Set 方法的主要原因有两个(泛泛而言):

  1. 您希望获得字段的简洁性,同时向“外部”提供只读访问权限,而向“内部”提供读写访问权限。
  2. 您希望获得字段的简洁性和内涵,同时秘密地能够强制执行或操作底层事物,例如:
    1. 要求值在某个特定范围内(在设置时)。
    2. 在设置时自动清除或夹紧某些值。
    3. 更新(或延迟更新)其他依赖数据(在设置时)。
    4. 避免完全计算对于该字段必要的内容,直到实际使用该字段(在获取时)。
    5. 任何其他你认为需要放置在方法中但又希望外界仍将其视为字段的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接