При работе над чем-то еще в последнее время я столкнулся с немного странным фрагментом кода на KeyValuePair<TKey, TValue>.ToString()
implementation.KeyValuePair <TKey, TValue>. Подробности реализации ToString
public override string ToString()
{
StringBuilder stringBuilder = StringBuilderCache.Acquire(16);
stringBuilder.Append('[');
if (this.Key != null)
{
StringBuilder arg_33_0 = stringBuilder;
TKey tKey = this.Key;
arg_33_0.Append(tKey.ToString());
}
stringBuilder.Append(", ");
if (this.Value != null)
{
StringBuilder arg_67_0 = stringBuilder;
TValue tValue = this.Value;
arg_67_0.Append(tValue.ToString());
}
stringBuilder.Append(']');
return StringBuilderCache.GetStringAndRelease(stringBuilder);
}
Пропустив StringBuilderCache
использование класса (который на самом деле хороший пример улучшения производительности в самой .NET) У меня есть вопрос:
Почему
if (this.Key != null)
{
StringBuilder arg_33_0 = stringBuilder;
TKey tKey = this.Key;
arg_33_0.Append(tKey.ToString());
}
лучше тогда
if(this.Key != null)
{
stringBuilder.Append(this.Key.ToString());
}
?
В чем преимущества назначения новых локальных переменных вместо непосредственного использования экземпляров?
Подумал об этом 10 лет назад, декомпилируя пользовательскую реализацию 'KeyValuePair', с простым' stringBuilder.Append (Value.Key); '. Большое спасибо! – MarcinJuraszek
Другой вопрос: почему они используют 'StringBuilder' вообще для двух символов и 3 строк? –