Я заметил, что
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 не делает этого? Есть что-то, чего я не вижу?