Why in Boolean type there are two fields with the same value?
internal const int True = 1;
internal const int False = 0;
internal const string TrueLiteral = "True";
internal const string FalseLiteral = "False";
and
public static readonly string TrueString;
public static readonly string FalseString;
static Boolean()
{
TrueString = "True";
FalseString = "False";
}
in reflector generated code, methods don’t use those strings but:
public string ToString(IFormatProvider provider)
{
if (!this)
{
return "False";
}
return "True";
}
would’t it be better to use those const values?
EDIT: in CIL there is no difference between using const strings and instance strings.
So when I declare a private const string = “a”, wherever in the application “a” is used, Jitter uses const value, or is it only in const string’s scope?
The reason is that public
constvariables can be problematic if their values are later changed. Since their values are directly replaced in the CIL, you may end up with two assemblies using different values for the sameconst. To avoid this, the type only exposesreadonlyvariables (TrueStringandFalseString).Internally, there is no problem: if you change the
constvalues in the code, you will compile the assembly anyway. So this is the reason for theinternal consts (TrueLiteralandFalseLiteral). This way, their assembly can take advantage of their higher speed.Since
constvariables are directly replaced by their values in CIL, you cannot see them in your reflector generated code. But they are indeed used insideToString.