C# 属性的编码样式和性能

C# 属性的编码样式和性能,c#,properties,coding-style,C#,Properties,Coding Style,如果我在定义如下的类中有一个属性: private int mSomeNumber; public int SomeNumber { get { return mSomeNumber; } } 在同一个类中,我很好奇人们是使用成员变量,还是使用属性。例如: public void DoSomething() { if(mSomeNumber == 0) // This way? //if(SomeNumber == 0) // Or this way

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

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
   }
}

我认为直接使用member变量可能会节省调用,但我想知道该属性是否会编译为相同的内容。有人知道它是不是或者“标准”可能是什么吗?

现在,我们只做:

public int SomeNumber
{
   get;
   private set;
}
因此,我们不必费心声明私有成员字段


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

除非您对解决方法有特定要求(例如,根据),否则您应该使用该属性


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

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


Jon Skeet在他的文章中描述了你所获得的好处:。

如果有的话,差别将非常小。因此,从“性能”的角度来看待它是错误的。如果您确实使用了这个成员,那么它可能很重要,您可能应该编写完全不同的代码

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

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


因为这种情况很少见,这意味着我们通常会完全没有支持字段,就像@Frederic的回答一样。

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

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


阅读其他ASNWER以了解属性的好处。

是的,但是您的setter可能需要属性更改通知或其他验证,然后您就可以使用私有成员字段了,问题仍然存在。如果您需要实现
INotifyPropertyChanged
,您该怎么办,如果要发送更改通知,通常需要一个支持字段。因此,我认为问题的目的是直接引用属性的getter还是它的backing字段。@John,@Femaref,true,但在这种情况下,是否在类本身中使用属性或私有字段是触发通知与否的问题,而不是性能问题。@Reddog,哦,我明白了,我在想二传手。嗯,我猜一个getter只执行
返回\u字段是内联的一个很好的候选者:)我听说在getter中增加值是一个坏主意,但我得到了你得到的,很好的建议。我想另一个例子是,如果getter只是从其他地方(在嵌套对象中)结束状态。哎呀,编辑这个答案。更改状态的属性获取程序在调试器监视表达式中是一个灾难。