Today I found an article where a const
field is called compile-time constant while a readonly
field is called runtime constant. The two phrases come from 《Effective C#》. I searched in MSDN and the language spec, find nothing about runtime constant.
No offensive but I don't think runtime constant is a proper phrase.
private readonly string foo = "bar";
creates a variable named "foo", whose value is "bar", and the value is readonly, here it is a variable, no business on constant
. A readonly variable is still a variable, it can't be a constant. Variable and constant are mutually exclusive.
Maybe this question goes overboard, still I want to listen to others' opinions. What do you think?
I believe that author means the following:
Consider example:
public class A {
public const int a = Compute();
private static int Compute(){
/*some computation and return*/
return some_computed_value;
}
}
this, will not compile, as you have to have constant value to assign to a
.
So this is a meaning of compile-time constant .
Instead if you change this to
public class A {
public readonly int a = Compute();
private static int Compute(){
/*some computation and return*/
return some_computed_value;
}
}
this will compile. It at runtime makes a computation and assign it to a
.
This is a meaning of runtime constant
As you yourself note, that term is not used in the language specification etc. So; blame that book! I would call it a "readonly field", because that is what it is - where the definition of "readonly" here relates to the initializer/constructor, and is limited to regular code. For example, even readonly fields are changeable...
// how to annoy your colleagues...
typeof(string).GetField("Empty").SetValue(null, " ");
(Note, this no longer works on recent CLR versions - the JIT presumably replaces the field-load with a ldstr - but it genuinely did for a very long time)
(more genuine reasons to do this on objects relate to deserialization)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With