Почему .NET Boolean имеет TrueLiteral и TrueString? - PullRequest
2 голосов
/ 06 апреля 2010

Почему в булевом типе есть два поля с одинаковым значением?

internal const int True = 1;
internal const int False = 0;
internal const string TrueLiteral = "True";
internal const string FalseLiteral = "False";

и

public static readonly string TrueString;
public static readonly string FalseString;

static Boolean()
{
    TrueString = "True";
    FalseString = "False";
}

в коде, сгенерированном рефлектором, методы не используют эти строки, но:

public string ToString(IFormatProvider provider)
{
    if (!this)
    {
        return "False";
    }
    return "True";
}

не лучше ли использовать эти постоянные значения?

РЕДАКТИРОВАТЬ: в CIL нет никакой разницы между использованием строк const и строк экземпляров.

Так, когда я объявляю приватную строку const = "a", где бы в приложении не использовалось слово "a", Jitter использует значение const или это только в области действия строки const?

Ответы [ 2 ]

4 голосов
/ 06 апреля 2010

Краткий обзор различий между const и readonly в C #:

Const:

  • Не может быть статичным.
  • Значение оценивается во время компиляции .
  • Инициализирован только при объявлении.

только для чтения:

  • Может быть как на уровне экземпляра, так и статическим.
  • Значение оценивается во время выполнения .
  • Может быть инициализирован в объявлении или кодом в конструкторе.

( источник )

Поэтому, когда вы видите жестко закодированный «Ложь», он просто подставлялся во время компиляции из константы FalseLiteral.

3 голосов
/ 06 апреля 2010

Причина в том, что публичные const переменные могут быть проблематичными, если их значения будут позже изменены. Поскольку их значения напрямую заменяются в CIL, вы можете получить две сборки, использующие разные значения для одного и того же const. Чтобы избежать этого, тип предоставляет только readonly переменные (TrueString и FalseString).

Внутренне проблем нет: если вы измените значения const в коде, вы все равно скомпилируете сборку. Так что это причина для internal const s (TrueLiteral и FalseLiteral). Таким образом, их сборка может использовать преимущества более высокой скорости.

Поскольку const переменные напрямую заменяются их значениями в CIL, вы не сможете увидеть их в сгенерированном коде рефлектора. Но они действительно используются внутри ToString.

...