C#属性可以让程序运行得更慢吗?

时间:2013-01-22 00:42:39

标签: c# properties setter getter

我担心人们总是使用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;
    }

3 个答案:

答案 0 :(得分:5)

首先,这种类型的优化通常会产生反效果 - 尝试优化单个方法调用通常对任何现实世界都没有影响,测量性能。您可能最好将精力集中在优化您在更高级别使用的算法上,而不是微观优化所使用的语言功能。

  

如果频繁使用,它是否会影响程序的性能?这样做是不是更好:

没有。一旦编译,这将是有效的。

此外,在发布版本中,JIT编译器通常会完全优化get和set方法,完全内联它们。这将有效地使其执行与使用公共字段完全相同,并且具有与直接成员访问相同的性能。

答案 1 :(得分:3)

编译时也是如此。

要获得证明,您可以查看this链接。以下是摘录:

  

注意清单10-5中的get和set访问器如何没有   实现。在自动实现的属性中,C#编译器   在幕后创建后备存储字段,给出相同的内容   与传统属性一起存在的逻辑,但是从中拯救你   必须使用传统属性的所有语法。

答案 2 :(得分:0)

这取决于编译器。是的,这可能会影响性能。例如,如果您使用Unity Engine属性开发的游戏可能不会自动转换为字段,则可以检查生成的IL2CPP代码并找到其C ++包装器。因此,如果在渲染和物理循环中使用字段代替,则可以赢得一点收益。如果您拥有大量的此类属性访问权限,则可能不会在探查器中单独找到它们,因此,如果所有巨大的代码库在关键位置具有很多属性,将来将很难进行优化,因为它们的影响将平均分配。因此,我宁愿在开发时间之内在关键位置使事情变得更优化,而不是将它们推迟到分析时间。但是可以在不太重要的位置拥有属性。

相关问题