замечаю, что
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<T>()
, мы обнаружим, что она кэширует и повторно использует пустые массивы:
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<T>()
, но также и new T[0]
. Если оптимизация в Enumerable.Empty<T>()
того стоит, то наверняка это будет еще дороже?
Почему CLR не делает этого? Я что-то упускаю?