C#属性可以使程序运行缓慢吗?

问题描述 投票:1回答:3

我担心人们总是使用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;
    }
c# properties setter getter
3个回答
5
投票

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

如果经常使用,是否会影响程序的性能?这样不是更好吗:

没有一旦编译,这实际上是相同的。

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


3
投票

编译时是同一件事。

为证明您可以签出this链接。这是摘录:

请注意清单10-5中的get和set访问器没有实现。在自动实现的属性中,C#编译器在后台创建后备存储字段,并提供相同的传统属性存在的逻辑,但可以避免必须使用传统属性的所有语法。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.