1

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

3 回答 3

5

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

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

不,这在编译后实际上是相同的。

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

于 2013-01-22T00:54:32.480 回答
3

编译的时候也是一样的。

为了证明,您可以查看链接。这是它的摘录:

注意示例 10-5 中的 get 和 set 访问器没有实现。在自动实现的属性中,C# 编译器在后台创建后备存储字段,提供与传统属性相同的逻辑,但您不必使用传统属性的所有语法。

于 2013-01-22T00:43:32.987 回答
1

这取决于编译器。是的,它可能会影响性能。例如,如果您正在开发一个游戏,其 Unity Engine 属性可能不会自动转换为字段,您可以检查生成的 IL2CPP 代码并找到它们的 C++ 包装器。所以,如果你在渲染和物理循环中使用字段,你可以赢一点。如果您拥有大量此类属性访问权限,您可能不会在分析器中单独找到它们中的任何一个,因此如果您所有庞大的代码库在关键位置都有很多属性,那么将来将很难优化,因为它们的影响将均匀分布. 因此,我更喜欢在开发时间的关键位置使事情变得更加优化,而不是将它们延迟到分析时间。但是在不太重要的地方拥有房产是可以的。

于 2020-01-21T13:24:10.180 回答