Почему CLR повторно использует пустые строки, но не пустые массивы?

Я заметил, что

Console.WriteLine((object) new string(' ', 0) == (object) new string(' ', 0));

печатает true , что указывает на то, что CLR сохраняет пустую строку и повторно использует тот же экземпляр. (Она печатает false ) для любого другого числа, кроме 0 .)

Однако то же самое неверно для массивов:

Console.WriteLine(new int[0] == new int[0]);   // False

Теперь, если мы посмотрим на реализацию Enumerable.Empty () , мы обнаружили, что он кэширует и повторно использует пустые массивы:

public static IEnumerable<TResult> Empty<TResult>()
{
    return EmptyEnumerable<TResult>.Instance;
}

[...]

public static IEnumerable<TElement> Instance
{
    get
    {
        if (EmptyEnumerable<TElement>.instance == null)
            EmptyEnumerable<TElement>.instance = new TElement[0];
        return EmptyEnumerable<TElement>.instance;
    }
}

Итак, команда разработчиков фреймворка почувствовала, что сохранение пустого массива для каждого типа того стоит. CLR могла бы, если бы захотела, пойти на небольшой шаг далее и сделайте это изначально, поэтому это применимо не только к вызовам Enumerable.Empty () , но также и new T [0] .Если оптимизация в Enumerable. Empty () того стоит, конечно, оно того стоит?

Почему CLR этого не делает? Что-то мне не хватает?

14
задан Timwi 27 October 2011 в 12:13
поделиться