C# 自动属性与考虑可变性能的属性

C# 自动属性与考虑可变性能的属性,c#,properties,C#,Properties,我理解两者之间的区别。并阅读与此相关的线程。我的问题是关于任何性能增益。我曾经用局部变量创建属性。每当我在类中使用属性时,我都使用局部变量而不是属性。我假设这有一点好处,而不是调用属性,然后属性调用局部变量。在自动属性中,这是不可能的。我的假设正确吗?在我的方法中可能没有什么好处吗 样品 Public class class1 { private int _someField; public int SomeField { get{return _someField;} set {

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

样品

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

 }  
}

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

这就是MSDN所说的

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

所以

相当于

public int SomeField {get;set;}
在Corak的评论之后,我想补充一点,如果您的属性没有更多的逻辑,那么像上面的示例中那样进行简单赋值,那么

someClass._someField
会是一样的,差不多

someClass.SomeField

如果你认为这是你的瓶颈。然后再想想。不可能。

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

这就是MSDN所说的

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

所以

相当于

public int SomeField {get;set;}
在Corak的评论之后,我想补充一点,如果您的属性没有更多的逻辑,那么像上面的示例中那样进行简单赋值,那么

someClass._someField
会是一样的,差不多

someClass.SomeField

如果你认为这是你的瓶颈。然后再想想。不可能是。

是否使用编译器转换为方法调用的自动属性。。或者直接访问支持字段。。JIT编译器很可能会将字段访问内联

编辑:

自动属性被编译成方法调用。因此:

public string Property { get; set; }
…成为:

private string _property;

public string get_Property() {
    return _property;
}

public void set_Property(string value) {
    _property = value;
}
当用户看到这一点时,很可能会内联字段访问,因为它确实是一个主要候选对象。因此,如果您这样做:

Property = "some value";
它不会生成以下内容:

set_Property("some value");
它更有可能做到这一点:

_property = "some value";

所以,真的,根本没有处罚。需要注意的是,这是特定于JIT编译器实现的实现。。但老实说,如果这类东西不是内联的候选对象,我不知道什么是内联

是否使用编译器转换为方法调用的自动属性。。或者直接访问支持字段。。JIT编译器很可能会将字段访问内联

编辑:

自动属性被编译成方法调用。因此:

public string Property { get; set; }
…成为:

private string _property;

public string get_Property() {
    return _property;
}

public void set_Property(string value) {
    _property = value;
}
当用户看到这一点时,很可能会内联字段访问,因为它确实是一个主要候选对象。因此,如果您这样做:

Property = "some value";
它不会生成以下内容:

set_Property("some value");
它更有可能做到这一点:

_property = "some value";

所以,真的,根本没有处罚。需要注意的是,这是特定于JIT编译器实现的实现。。但老实说,如果这类东西不是内联的候选对象,我不知道什么是内联

取得的成绩并不多。然而,属性是一个代码包装器,它可以包含比get{return…;}和set{…=value;}更多的代码,例如用于触发一些相关事件。问题不在于属性和变量。它是关于使用局部变量而不是using@KingKing-嗯,自动属性{get;set;}不会有更多的逻辑。-对于OP来说,这是一件你可以很容易地自己描述的事情。但我只想说一句,如果这是你的瓶颈,那么你可能会有其他问题…可能重复@Corak我谈到的手动属性,我不是一个不知道什么是自动属性的新手。获得的性能不是很多。然而,属性是一个代码包装器,它可以包含比get{return…;}和set{…=value;}更多的代码,例如用于触发一些相关事件。问题不在于属性和变量。它是关于使用局部变量而不是using@KingKing-嗯,自动属性{get;set;}不会有更多的逻辑。-对于OP来说,这是你可以做到的
个人资料非常容易。但我只想说,如果这是你的瓶颈,那么你可能会有其他问题…可能重复@Corak我说的手动属性,我不是一个不知道什么是自动属性的新手。问题是,如果在类中使用_someField而不是someField会更快。当然,使用_someField而不是someField会更快,但这并不重要。我们必须在“someField”或“someField”之间做出选择,这取决于性能以外的其他因素。@KingKing我喜欢你这样坚定地说,我们中的一些人不会做出一些重要的设计选择,只是因为它不能提供纯性能,但由于现代OO语言中的一些抽象,不可避免地会有性能损失。。。你可以利用它和现代C++和其他预编译语言智能化,我不知道,但这是另一个故事……问题是,如果在类中,使用“快速”字段而不是“某个字段”,当然,使用“某个字段”代替“某个字段”更快,但这并不重要。我们必须在“someField”或“someField”之间做出选择,这取决于性能以外的其他因素。@KingKing我喜欢你这样坚定地说,我们中的一些人不会做出一些重要的设计选择,只是因为它不能提供纯性能,但由于现代OO语言中的一些抽象,不可避免地会有性能损失。。。你可以利用现代C++和其他一些我不知道的预编译语言来聪明,但是这是另一个故事…抱歉我没有得到正确的答案。你能解释一下吗。顺便说一句,我用了。我理解你的问题。。这直接回答了这个问题。我建议单击我提供给JIT编译的链接,并查看.NET代码是如何变成机器代码的。答案基本上是,没有性能差异。因此,如果调用get_Propertysomefield,它将标识它是一个自动属性,并将直接读取支持字段?不,您调用属性。C编译器生成一个get_属性方法,然后调用该方法。然后,JIT编译器可能会直接访问_属性,而不是调用get_属性。你能解释一下吗。顺便说一句,我用了。我理解你的问题。。这直接回答了这个问题。我建议单击我提供给JIT编译的链接,并查看.NET代码是如何变成机器代码的。答案基本上是,没有性能差异。因此,如果调用get_Propertysomefield,它将标识它是一个自动属性,并将直接读取支持字段?不,您调用属性。C编译器生成一个get_属性方法,然后调用该方法。然后,JIT编译器可能会直接访问_属性,而不是调用get_属性。