If you are worried about performance, run a profiler. Then change code. Chances are that you will never in a million years guess 100% correctly where the time is going. You could be changing the 0.02% timing, and leaving the method that contributes 62% of the burden. You could also be making it worse. Without a profiler and evidence, you are blind.
You can't assume that the JIT will inline a property getter. There are many reasons it may or may not do so; size of the method body, virtual, value vs reference type, architecture, debugger attached, etc.
"Hoisting" still has a place, and can still achieve savings if the code is called repeatedly in a tight loop; for example:
var count = list.Count;
for(int i = 0 ; i < count ; i++) {...}
(forget the for
vs foreach
debate fr the above - this is an orthogonal discussion). In the above, the "hoist" will help performance. But just to be really confusing - with arrays, it is the opposite, and it is more efficient to not hoist it:
for(int i = 0 ; i < arr.Length ; i++) {...}
The JIT recognises this and removes the bounds check (as arrays are fixed size).