C#访问者应该使用私有变量还是动态计算?

Cod*_*der 3 c# performance accessor

哪个是更好的编程习惯,为什么?

我有一个这样的课:

class data {

    public double time { get; internal set; }
    public double count { get; internal set; }
    public average_count { ... }

}
Run Code Online (Sandbox Code Playgroud)

其中average_count应为read_only并计算计数/时间.

将访问者编写为:

public average_count { get {

    return (time == 0) ? 0 : (count / time);

}}
Run Code Online (Sandbox Code Playgroud)

或者我应该做以下事情:

private _avg_count;

public average_count {
    get 
    {
        return _avg_count;
    }

    internal set
    {
        return _avg_count;
    }
}
Run Code Online (Sandbox Code Playgroud)

在时间和计数集访问器中更新_avg_count的位置?

看起来第一个更容易阅读,但如果经常访问average_count可能会更慢.编译器优化是否会使差异无关紧要?

Ski*_*ick 13

即时执行会产生更易读的代码.预先计算可以提高性能,但是只有在(a)有必要和(b)您已经分析并且它有所不同时,您才应该这样做.

最重要的是,可读性和可维护性只有在绝对必要时才能牺牲性能.

  • 避免预先计算意味着数据不会不同步. (2认同)

Dan*_*Tao 5

这是一个看似简单的问题,但几乎不可能回答.原因在于"正确"取决于许多因素.

1.表现

在他的回答中,Skilldrick建议您更喜欢可读性优于一般规则的内容:

只有绝对必要时,才能牺牲可扩展性和可维护性 .

我会反驳说,这只适用于典型的商业应用程序,其中性能和功能是两个明显可区分的功能.在某些高性能软件场景中,这并不是一件容易的事情,因为性能和功能可能会变得密不可分 - 也就是说,如果程序完成任务的程度取决于它的执行情况(这种情况就是如此)我目前的工作地点,一家进行算法交易的公司.

所以这是你的判断.最好的建议是在你有一个问题时进行分析; 如果在你的情况下牺牲性能的可读性是合适的,那么你应该这样做.

2.内存使用

0xA3建议一种相当优雅的方法,提供各种类型的折衷:只根据需要计算值,然后缓存它.

当然,这种方法的缺点是它需要更多的内存来维护.An int?需要与int加号a 基本相同的内存量bool(由于对齐问题,实际上可能意味着64位而不是40位).如果你有这个data类的实例的加载和加载,并且内存是你所瞄准的平台上的稀缺资源,那么每个实例的另外32位膨胀你的类型可能不是最聪明的举动.

3.可维护性

也就是说,我总体上同意其他人所说的,在其他条件相同的情况下,你最好在可读性方面犯错,以便在将来重新访问时能够理解你的代码.然而,这个问题的各种方法都没有特别复杂.

最重要的是,只有你知道自己的确切情况,因此你才能最好地决定在这里做什么.