我理解差异。两者之间。并阅读与此相关的线程。我的问题是关于任何性能提升。我曾经用局部变量创建属性。每当我使用属性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 + ")
}
}
答案 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
而且,如果你认为这是你的瓶颈。然后再想一想。它不可能。