C#是否缓存类成员计算结果?两种实现性能是否等同?
C#类成员计算结果的缓存行为及两种Area实现的性能差异
C#不会自动缓存类成员的计算结果,除非你手动实现缓存逻辑。比如你给出的第一种表达式体写法的
Area属性,每次调用它的get访问器时,都会重新执行X * Y的计算——哪怕X和Y的值根本没变化。两种
Area实现的性能完全不同:第一种实现(表达式体属性):
public double Area => X * Y; private double X { get; set; } = 5; private double Y { get; set; } = 5;每次访问
Area都要读取X、Y的当前值,再执行乘法运算。如果频繁访问Area但X/Y很少变动,会产生不必要的重复计算开销。不过好处是X/Y被修改后,Area能自动返回最新的计算结果。第二种实现(构造函数初始化的只读属性):
public double Area { get; } public Rectangle(double x = 5, double y = 5) { Area = x * y; }Area的值只在类实例化时计算一次,之后每次访问直接返回预先存储好的值,没有额外计算开销,性能更优。但缺点是如果类内部后续修改了X/Y的值(虽然这里是private set,但存在修改可能),Area不会自动更新,始终保持构造时的结果。
如果想要兼顾灵活性(X/Y修改后Area自动更新)和性能(避免重复计算),可以手动实现缓存逻辑:比如在X/Y的setter里更新缓存的Area值,或者用
Lazy<T>来延迟计算并缓存结果。
内容的提问来源于stack exchange,提问作者91378246
相关产品推荐
相关产品推荐

