我担心人们总是使用getter-setter模式:
public int MyVariable { get; private set; }
public void SomeFunction(){
MyVariable = 10;
}
据我所知,编译为:
private int myVariable;
public int GetMyVariable(){
return myVariable;
}
private void SetMyVariable(int value){
myVariable = value;
}
public void SomeFunction()
{
SetMyVariable(10);
}
如果频繁使用,它是否会影响节目的效果?这样做不是更好:
private int myVariable;
public int MyVariable { get {return myVariable; } }
public void SomeFunction(){
myVariable = 10;
}
答案 0 :(得分:5)
首先,这种类型的优化通常会产生反效果 - 尝试优化单个方法调用通常对任何现实世界都没有影响,测量性能。您可能最好将精力集中在优化您在更高级别使用的算法上,而不是微观优化所使用的语言功能。
如果频繁使用,它是否会影响程序的性能?这样做是不是更好:
没有。一旦编译,这将是有效的。
此外,在发布版本中,JIT编译器通常会完全优化get和set方法,完全内联它们。这将有效地使其执行与使用公共字段完全相同,并且具有与直接成员访问相同的性能。
答案 1 :(得分:3)
编译时也是如此。
要获得证明,您可以查看this链接。以下是摘录:
注意清单10-5中的get和set访问器如何没有 实现。在自动实现的属性中,C#编译器 在幕后创建后备存储字段,给出相同的内容 与传统属性一起存在的逻辑,但是从中拯救你 必须使用传统属性的所有语法。
答案 2 :(得分:0)
这取决于编译器。是的,这可能会影响性能。例如,如果您使用Unity Engine属性开发的游戏可能不会自动转换为字段,则可以检查生成的IL2CPP代码并找到其C ++包装器。因此,如果在渲染和物理循环中使用字段代替,则可以赢得一点收益。如果您拥有大量的此类属性访问权限,则可能不会在探查器中单独找到它们,因此,如果所有巨大的代码库在关键位置具有很多属性,将来将很难进行优化,因为它们的影响将平均分配。因此,我宁愿在开发时间之内在关键位置使事情变得更优化,而不是将它们推迟到分析时间。但是可以在不太重要的位置拥有属性。