1

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

样本

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 + ")

 }  
}
4

2 回答 2

5

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

编辑:

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

public string Property { get; set; }

..变成:

private string _property;

public string get_Property() {
    return _property;
}

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

JIT 编译器看到这一点时,它可能会内联字段访问(它确实是主要候选者)。因此,如果您这样做:

Property = "some value";

它不会产生这个:

set_Property("some value");

更有可能这样做:

_property = "some value";

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

于 2013-09-02T05:17:11.117 回答
2

当您还没有自己创建字段(自动属性)时,编译器将为您生成支持字段。因此,根本没有性能提升。

这就是 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

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

于 2013-09-02T05:15:20.823 回答