stavo navigando l'albero dei sorgenti di .NET core oggi e attraversò di corsa this pattern in System.Collections.Immutable.ImmutableArray<T>
:Che vantaggio c'è di memorizzare "questo" in una variabile locale in un metodo struct?
T IList<T>.this[int index]
{
get
{
var self = this;
self.ThrowInvalidOperationIfNotInitialized();
return self[index];
}
set { throw new NotSupportedException(); }
}
Questo modello (memorizzazione this
in una variabile locale) sembra essere coerentemente applicato in questo file ogni volta che altrimenti sarebbe fatto riferimento this
più volte nello stesso metodo, ma non quando viene fatto riferimento una sola volta. Così ho iniziato a pensare a quali potrebbero essere i relativi vantaggi nel farlo in questo modo; mi sembra che il vantaggio sia probabilmente legato alle prestazioni, quindi ho seguito questa strada un po 'oltre ... forse trascurerò qualcos'altro.
Il CIL che viene emesso per il "negozio this
in un locale" modello sembra essere simile a un ldarg.0
, poi ldobj UnderlyingType
, quindi stloc.0
in modo che i riferimenti successivi provengono da ldloc.0
invece di una nuda ldarg.0
come sarebbe ad appena utilizzare più volte this
.
Forse ldarg.0
è significativamente più lento di ldloc.0
, ma non abbastanza sia per il C# to-CIL traduzione o il jitter a cercare nuove opportunità per ottimizzare questo per noi, in modo tale che ha più senso di scrivere questo strano dall'aspetto modello in codice C# in qualsiasi momento altrimenti emetteremo due istruzioni ldarg.0
in un metodo di istanza struct?
Update: o, sai, ho potuto guardato i commenti all'inizio di quel file, che explain esattamente quello che sta succedendo ...
Hmm, ma considerando che 'System.Collections.Immutable.ImmutableArray' è immutabile, se questa è l'unica considerazione, allora questo modello non è semplicemente un modo per masterizzare alcuni cicli della CPU in più rispetto al contrario? –
Ora sono curioso. se guardate questo thread http://stackoverflow.com/questions/9648939/c-sharp-structs-questo è quindi possibile impostare 'this = ...' se chiamando 'this' crea una nuova istanza del struct? – Benj
@ Benj, cosa intendi con "chiamare questo"? Nota che una struct è un tipo di valore, quindi un assegnamento "=" copia la struct ... – elgonzo