Я просматривал дерево исходников .NET Core, сегодня и натыкался this pattern в System.Collections.Immutable.ImmutableArray<T>
:Какое преимущество хранения «this» в локальной переменной в методе struct?
T IList<T>.this[int index]
{
get
{
var self = this;
self.ThrowInvalidOperationIfNotInitialized();
return self[index];
}
set { throw new NotSupportedException(); }
}
Этот шаблон (хранящий this
в локальной переменной), кажется, последовательно применяется в этом файле всякий раз, когда this
бы в противном случае ссылки несколько раз в том же методе, но не тогда, когда он упоминается только один раз. Поэтому я начал думать о том, какие относительные преимущества могут быть сделаны таким образом; мне кажется, что преимущество, скорее всего, связано с производительностью, поэтому я спустился по этому маршруту немного дальше ... возможно, я забываю что-то еще.
CIL, который получает испускаемый для «магазина this
в местном» модель, кажется, выглядеть как ldarg.0
, то ldobj UnderlyingType
, то stloc.0
так, чтобы последующие ссылки приходят из ldloc.0
вместо голой ldarg.0
, как это было бы просто используйте this
несколько раз.
Может ldarg.0
значительно медленнее, чем ldloc.0
, но не достаточно для либо C# -в-CIL перевод или джиттер, чтобы искать возможности оптимизировать это для нас, таким образом, что она имеет больше смысла писать это странно выглядящий шаблон в коде C# в любое время, когда мы в противном случае испустили бы две команды ldarg.0
в методе экземпляра структуры?
Update: или, вы знаете, я мог бы посмотрел на комментарии в верхней части этого файла, который explain именно то, что происходит ...
Хм, но учитывая, что 'System.Collections.Immutable.ImmutableArray' неизменен, если это единственное соображение, то разве это не просто шаблон для записи нескольких циклов процессора, чем в противном случае? –
Теперь мне любопытно. если вы посмотрите на этот поток http://stackoverflow.com/questions/9648939/c-sharp-structs - вот почему можно установить 'this = ...', если вызов 'this' создает новый экземпляр структура? – Benj
@Benj, что вы имеете в виду под «называть это»? Обратите внимание, что struct является типом значения, поэтому присваивание «=» копирует структуру ... – elgonzo