c# - 在属性 getter 中或在创建实例时评估?

标签 c#

好的,一个简单的问题。

首先,我必须说我关心的不是性能。我完全清楚,无论一个选项或另一个选项可能带来的性能成本如何,都可能毫无意义,甚至不值得在正常情况下考虑。它更多地与设计标准和对大多数编码人员如何做的好奇心有关。

好的,所以问题很简单:

假设我有一个 ComplexNumber struct,我可以通过以下方式实现它:

public struct Complex : IEquatable<Complex>, IFormattable
{
    readonly double realPart, imaginaryPart, magnitude, argument;
    readonly static Complex j = new Complex(0, 1);

    public Complex(double realPart, double imaginaryPart)
    {
        this.realPart = realPart;
        this.imaginaryPart = imaginaryPart;
        this.magnitude = Math.Sqrt(Math.Pow(realPart, 2) + Math.Pow(imaginaryPart, 2));
        this.argument = Math.Atan2(imaginaryPart, realPart);
    }

    public double RealPart { get { return this.realPart; } }
    public double ImaginaryPart { get { return this.imaginaryPart; } }
    public double Magnitude { get { return this.magnitude; } }
    public double Argument { get { return this.argument; } }

    public static Complex J { get { return Complex.j; } }
    ...
 }

MagnitudeArgument 属性具有在构造时评估的支持字段。另一种选择是简单地评估任一 getter 中的相应值。

最推荐的方法是什么?为了拥有标准,是否有任何编码标准推荐任何选项?如果没有,通常首选是什么?还是仅取决于性能,而在我的情况下是无关紧要的?

最佳答案

我倾向于直接在 getter 中计算值,因为它更具可读性:如果您想知道 Argument 的作用,只需查看它的代码即可。如果像现在一样在字段中缓存值,则必须转到 Argument 属性 → argument 字段 → 构造函数。

如果性能确实很重要,那么很明显,在您的情况下找出哪个选项更好的正确方法是分析。但作为一个猜测,我认为在字段中缓存值的版本也会更慢,特别是如果您不经常使用计算值。这是因为 struct 一直被复制,这些字段使 struct 的大小增加了一倍。

关于c# - 在属性 getter 中或在创建实例时评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9077315/

相关文章:

c# - .Net5 FocusAsync() 未编译

c# - 如果您知道任务已完成,可以在异步方法中调用 task.Result 吗?

c# - 代码分析不适用于 nuget 包中的规则集(来自 .props)

c# - WebException.Status 未序列化

c# - 在 asp.net 中获取一行 # 和 proc 名称

c# - lock() 语句会阻塞进程/应用程序域中的所有线程吗?

c# - aspx中如何获取哪个页面抛出Application_error异常

c# - 快速高效地下载多个文件(异步)

c# - 调试代码时不转换 Web.config

c# - 在 C# 中从 SQLServer 查询日期?