我正在阅读有关 XNA 的教程,它使用以下代码:
private int score = 0;
public int Score
{
get { return score; }
set { score = value; }
}
使用房产有什么意义?为什么不直接使用public int Score = 0;
?
我正在阅读有关 XNA 的教程,它使用以下代码:
private int score = 0;
public int Score
{
get { return score; }
set { score = value; }
}
使用房产有什么意义?为什么不直接使用public int Score = 0;
?
我会在这里使用一个自动属性:
public int Score { get; protected set; }
因为它是“同样的东西,打字更少”(但实际上可能更好,因为它限制了谁可以设置分数;-)
属性的一些原因(通过公共成员变量):
属性允许单独设置 getter 和 setter 的可见性,如上所示。
属性可以在接口中指定。(您正在针对接口进行编程......对吗?;-)
在属性和成员变量之间切换会破坏 ABI(应用程序二进制接口:例如需要重新编译)。但是,可以在不破坏 ABI 的情况下重新定义现有属性的实现。
断点可以在属性中设置。偶尔很方便。
“封装”
通过公开字段,您可以公开实现细节。未来的“评分”可能不是要返回的简单值,而是计算的结果,因此通过将其隐藏在抽象的“GetScore”属性函数后面,您可以自由更改实现的细节,而无需打破消费者。
请注意,您可以在 C# 3.0 中使用具有属性的自动生成字段:
public int Score { get; set; } // this will create a hidden field, however all access (even from within the class) must be done by the accessor and mutator methods.
最大的原因是为了便于重构以包含逻辑。(从字段更改为属性需要在引用您的程序集中重新编译,因为 get 和 set 访问器实际上是方法。)正如 pst 的评论所示,您还可以为 get 和 set 分配不同的访问修饰符(例如protected set
)。使用自动属性,通常几乎没有理由(在可读性或其他方面)使用字段而不是属性。