Я заметил, что
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 этого не делает? Что-то мне не хватает?