JIT tarafından gerçekleştirilmekte olan bir optimizasyon için ava düştüğünüzü düşünüyorum. Aslında bu alanın değerini değiştirebilirsin, ancak bir nedenden ötürü, bu değişikliğin sonuçları hemen görünmeyecek.
typeof(Type).GetField("Delimiter", BindingFlags.Public | BindingFlags.Static).SetValue(null, '-');
Func<char> getDelimiter =() => Type.Delimiter;
Console.WriteLine(getDelimiter());
Bu kod güvenilir benim için alanın güncellenmiş değeri gösterdi: Ben aptal şey yaparak o çevrede başardı. Çok şaşırdığımı söyleyemem; alan salt okunur olarak bildirilir, bu nedenle JITter, alana erişirken bu varsayımı kullanabilir. Yaramaz ve kötülükle ilgili bir şey yapıyorsunuz, bunun aklı başında çalışmak için hiçbir beklentisi olmamalı.
Şimdi bool.TrueString
alanını değiştirirken bu kadar yoktu neden gelince, benim en iyi tahminim bir değer tipi (char
) nedeniyle bool.TrueString
Type.Delimiter
oysa bir referans tipi (string
) ediliyor olmasıdır. Bu tetikleyici farklı optimizasyonları hayal edebiliyorum.
Console.WriteLine(bool.TrueString);
006F2E53 8B 0D B8 10 40 03 mov ecx,dword ptr ds:[34010B8h]
006F2E59 E8 52 A6 77 54 call 54E6D4B0
Console.WriteLine(Type.Delimiter);
006F2E5E B9 2E 00 00 00 mov ecx,2Eh
006F2E63 E8 B0 FA E0 54 call 55502918
Oldukça net bir şekilde jitter edebi değeri '.'
ile değiştirerek Type.Delimiter
alan erişimini uzakta optimize görebiliriz:
ben bu kodu sökme bakmak yaptı. bool.TrueString
için statik alan erişimi hala gerçek alandan yükleniyor gibi görünüyor.
Değil emin dizeleri gibi
int
,long
vechar
gibi şeyler değil, işlerDateTime
gibi s veya referans türlerini içerir yine korkunç bir fikir gibi görünüyor. – itsme86kaynağa bakarak iki alan hemen hemen aynı ancak tam olarak bildirilmez, biri salt okunur = ".", Diğeri salt okunur = başka bir salt okunur değişmez. – pm100
Vahşi bir tahmin.Bool bir 'struct' ve 'Type' soyut bir sınıf olduğu için, Reflection bu yapı üzerinde biraz kara büyü yapabilir. Dediğim gibi .. sadece bir tahmin – lokusking