好的,一个简单的问题。
首先,我必须说我关心的不是性能。我完全清楚,无论一个选项或另一个选项可能带来的性能成本如何,都可能毫无意义,甚至不值得在正常情况下考虑。它更多地与设计标准和对大多数编码人员如何做的好奇心有关。
好的,所以问题很简单:
假设我有一个 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; } }
...
}
Magnitude
和Argument
属性具有在构造时评估的支持字段。另一种选择是简单地评估任一 getter 中的相应值。
最推荐的方法是什么?为了拥有标准,是否有任何编码标准推荐任何选项?如果没有,通常首选是什么?还是仅取决于性能,而在我的情况下是无关紧要的?
最佳答案
我倾向于直接在 getter 中计算值,因为它更具可读性:如果您想知道 Argument
的作用,只需查看它的代码即可。如果像现在一样在字段中缓存值,则必须转到 Argument
属性 → argument
字段 → 构造函数。
如果性能确实很重要,那么很明显,在您的情况下找出哪个选项更好的正确方法是分析。但作为一个猜测,我认为在字段中缓存值的版本也会更慢,特别是如果您不经常使用计算值。这是因为 struct
一直被复制,这些字段使 struct
的大小增加了一倍。
关于c# - 在属性 getter 中或在创建实例时评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9077315/