具有可变性能考虑的自动属性与属性

时间:2013-09-02 05:10:15

标签: c# properties

我理解差异。两者之间。并阅读与此相关的线程。我的问题是关于任何性能提升。我曾经用局部变量创建属性。每当我使用属性INSIDE类时,我使用局部变量而不是属性。我假设这有一点收获而不是调用属性然后调用局部变量的属性。在自动属性中,它是不可能的。我的假设是否正确?它在我的方法中有任何收获(可能很少)吗?

样品

Public class class1
{
 private int _someField;
 public int SomeField
 {
  get{return _someField;}
  set {_someField = value;} 
 }

 Public void Insert()
 {
     str= "insert into table values(" + SomeField + ")  
     //or is it better to use like this?
    str= "insert into table values(" + _someField + ")

 }  
}

2 个答案:

答案 0 :(得分:4)

是否使用编译器变为方法调用的自动属性..或者您直接访问支持字段.. JIT编译器可能无论如何都会内联字段访问。

编辑:

自动属性被编译为方法调用。所以这个:

public string Property { get; set; }

..变为:

private string _property;

public string get_Property() {
    return _property;
}

public void set_Property(string value) {
    _property = value;
}

JIT compiler看到这个时,很可能会内联访问(它确实是一个主要的候选者)。因此,如果你这样做:

Property = "some value";

它不会产生这个:

set_Property("some value");

更有可能这样做:

_property = "some value";

所以,真的,根本没有惩罚。重要的是要注意这是特定于实现的(特定于JIT编译器实现)..但老实说,如果那种东西不是内联的候选者,我不知道是什么!

答案 1 :(得分:2)

如果您没有自己创建字段(Automatic property),编译器将为您生成支持字段。所以,根本没有性能提升。

这就是MSDN所说的

  

在C#3.0及更高版本中,自动实现的属性生成   当不需要额外的逻辑时,属性声明更简洁   在物业访问者。它们还使客户端代码能够创建   对象。声明属性时,如下所示   例如,编译器创建一个私有的匿名支持字段   只能通过属性的get和set访问器访问。

所以,

private int _someField;
public int SomeField
{
    get{return _someField;}
    set {_someField = value;} 
}

相当于

public int SomeField {get;set;}

在Corak的评论之后,我想补充一点,如果你的属性没有任何逻辑,那么简单的赋值(如上例所示),那么

someClass._someField

将是相同的(好吧,差不多)

someClass.SomeField

而且,如果你认为这是你的瓶颈。然后再想一想。它不可能。