【问题标题】:What's so special about properties?房产有什么特别之处?
【发布时间】:2014-02-20 18:24:57
【问题描述】:

我已经掌握了属性的基础知识,但我认为它们没有真正的用途。它不只是返回方程的值吗?我的意思是,如果你可以为它写一个简单的等式,那么使用一个属性是没有意义的。

例如:

int currentValue;

public int CurrentValue
{
    get { return currentValue; }
    set { currentValue = value; }
}

和刚才一样:

currentValue;

另一个例子:

    int currentValue;

public int CurrentValue
{
    get { return currentValue * 5; }
    set { currentValue = value; }
}

与以下内容相同:

currentValue = currentValue * 5;

【问题讨论】:

  • 我不确定我是否在关注你,或者你没有基础知识:)。
  • 你的意思是“不就是和暴露字段一样吗?”答案是否定的,原因有很多。见csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx
  • +1 为"..properties, but I don't see a real use for them."
  • @gleng 私人二传手有时会派上用场。
  • @JerkeyTurkey 对不起,你刚刚被 Skeet'd。 Properties Matter,作者 Jon Skeet。

标签: c# properties


【解决方案1】:

在您的第一个示例中,Public Fields versus Automatic Properties 是一个很好的答案。基本上,对于非private 事物,您应该始终使用属性而不是字段。这使您可以在不破坏任何东西的情况下稍后修改代码,并创建private set。属性还可以在更改时通知代码或轻松提供默认值或计算值。您可以使用自动属性来减少无关代码:

public int CurrentValue { get; set; }

您的第二个示例没有很好地使用属性,因为它打破了关于属性如何工作的假设。例如。如果我将属性设置为3 并且没有抛出异常,我希望它在我得到它时是3,而不是15currentValue = currentValue * 5;,使用字段、属性或局部变量可能有意义,使值 5 大几倍。也许你的意思是这样的:

int currentBackingValue;

public int CurrentValue
{
    get { return currentBackingValue * 5; }
}

没有set,这可以很好地工作,并且不会违反任何约定和假设:CurrentValue 是根据currentBackingValue 计算的。

(顺便说一句,您应该注意,属性的getters 和setters 实际上是方法,只是使用类似字段的语法来替换Java 的getX/@ 987654337@标准)

【讨论】:

    【解决方案2】:

    如果您想在代码中添加一些额外的功能、集中您的功能以便您只能在一个地方更改它,那么 Getters 和 setters 属性非常方便。你几乎永远不知道什么时候必须改变某些东西,但你可以做好准备。

    这与封装和信息隐藏的概念一起,是基本的 OOP 概念,但非常重要...


    V E R Y     I M P O R T A N T


    不要小看这个巨大的力量D:

    它是如此...强大...

    【讨论】:

      【解决方案3】:

      属性也用于许多其他 .NET 技术,没有它们 WPF 将无法工作(在 setter 中调用 PropertyChanged 事件),WCF 在数据协定中广泛使用它们。

      尤其与 WPF 相关,属性的强大之处在于“get”和“set”字段都是函数,因此除了返回或设置支持的私有成员之外,还可以做很多事情。这比您想象的更有用。

      示例属性(用于 WPF)

      public String UIDisplayedString
      {
         get { return _member; }
         set 
         { 
            _member = value;
            PropertyChanged(new PropertyChangedEventArgs("UIDisplayedString"));
         }
      

      【讨论】:

        猜你喜欢
        • 2011-04-18
        • 2017-02-19
        • 2016-09-30
        • 1970-01-01
        • 2011-07-13
        • 2013-05-11
        • 2016-08-20
        • 2011-05-19
        相关资源
        最近更新 更多