【问题标题】:Coding style and performance of properties编码风格和性能表现
【发布时间】:2011-01-11 21:59:31
【问题描述】:

如果我在类中具有如下定义的属性:

private int mSomeNumber;
public int SomeNumber
{
   get
   {
      return mSomeNumber;
   }
}

在同一个类中,我很好奇人们是否使用成员变量,或者您是否使用属性。例如:

public void DoSomething()
{
   if(mSomeNumber == 0)  // This way?
   //if(SomeNumber == 0) // Or this way?
   {
      // Do something
   }
}

我在想直接使用成员变量可能会节省调用,但我想知道该属性是否会被编译为相同的东西。有谁知道它是否是或“标准”可能是什么?

【问题讨论】:

    标签: c# properties coding-style


    【解决方案1】:

    您应该使用该属性,除非您对解决方法有特定要求(例如 Henk's answer)。

    这样您就可以在不更改调用代码的情况下更改属性 getter 中的功能。例如,您的 getter 可能会将值格式化为更漂亮的返回值,或将其增加一个常量,或者如果它只是从 else where(在嵌套对象中)包装状态,等等。

    【讨论】:

    • 我听说在 getter 中增加值是个坏主意,但我明白你的意思,这是个好建议。
    • 我猜另一个例子是,如果 getter 只是从 else where (在嵌套对象中)包装状态。
    • 哎呀,编辑那个答案。改变状态的属性 getter 是调试器监视表达式中的灾难。
    【解决方案2】:

    这些天,我们只是这样做:

    public int SomeNumber
    {
       get;
       private set;
    }
    

    所以我们不必费心声明私有成员字段。

    声明一个成员字段并直接访问它可能节省一个(可能优化的)属性调用,但它也错过了该属性旨在提供的任何检查和平衡。

    【讨论】:

    • 是的,但是您的 setter 可能需要属性更改通知或其他验证,然后您又回到了拥有私有成员字段并且问题仍然存在。
    • 如果需要实现INotifyPropertyChanged怎么办?
    • 根据 John 的回复,如果要发送更改通知,通常需要一个支持字段。因此,我认为这个问题的意图是直接引用属性的 getter 还是引用它的支持字段。
    • @John, @Femaref, true,但是在那种情况下,是否使用属性或私有字段在类本身中是触发通知与否的问题,不是性能问题。
    • @Reddog,哦,我明白了,我在考虑二传手。好吧,我猜一个只做return _field; 的吸气剂是内联的好人选:)
    【解决方案3】:

    差异(如果有的话)将非常小。因此,从“性能”角度接近它是错误的。如果您确实如此频繁地使用此成员,这可能很重要,您可能应该完全不同地编写它。

    因此,主要标准是可读性和可靠性。这意味着使用该属性并使用所涉及的任何(未来)业务逻辑。

    只有在极少数情况下,您才会使用支持字段(例如避免验证规则或更改通知)。

    而且因为这种情况很少见,这意味着我们通常根本不需要支持字段,就像@Frederic 的回答一样。

    【讨论】:

      【解决方案4】:

      使用属性被认为是最佳实践,是 .net 和 C# 世界的标准做法。这与在公共合同中使用属性而不是字段具有相同的好处。

      Jon Skeet 在他的文章中描述了您获得的好处:Why Properties Matter

      【讨论】:

        【解决方案5】:

        由于这些属性几乎总是由 JIT 内联,因此不太可能导致性能差异。

        在原始情况下自己声明支持字段与在 Frédéric 的回复中使用自动属性之间也绝对没有区别。两种情况都有支持字段(在自动情况下隐藏)。

        阅读其他关于属性的好处的回答。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多