Welcome to Software Development on Codidact!
Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.
C#: Performance hit from using calculated property instead of get-only property with initializer?
JetBrains Rider suggests that I change this (for example):
public class Foo {
public int OnePlusOne { get; } = 1 + 1;
}
to this:
public class Foo {
public int OnePlusOne => 1 + 1;
}
As I understand it, the first example runs the calculation once and stores the result, whereas the second recalculates it every time. In examples where the calculation is more complex, won't the first have better performance than the second?
1 answer
You're right about the recalculation, as you can see from some easy experimentation by rigging two (dynamic) properties and logging what each one gives you.
public long TimeStamp1 { get; } = DateTime.Now.Ticks;
public long TimeStamp2 => DateTime.Now.Ticks;
Console.Log(Foo.TimeStamp1);
Console.Log(Foo.TimeStamp2);
Thread.Sleep(3000);
Console.Log(Foo.TimeStamp1);
Console.Log(Foo.TimeStamp2);
Thread.Sleep(3000);
Console.Log(Foo.TimeStamp1);
Console.Log(Foo.TimeStamp2);
My personal suspicion is that Rider thinks most people meant to have dynamic resolution of the property getter. Rider would then expect people to be surprised to discover that the initial value is never changed. Alexei notes that "if you want to store the initial evaluation result, define a static readonly
field instead to better convey the meaning (it is not supposed to change)."
1 comment thread