मुझे लगता है कि आप जेआईटी द्वारा किए जा रहे अनुकूलन का शिकार हो रहे हैं। आप वास्तव में उस क्षेत्र के मूल्य को बदल सकते हैं, लेकिन, किसी कारण से, उस परिवर्तन के परिणाम तुरंत दिखाई नहीं देंगे।
typeof(Type).GetField("Delimiter", BindingFlags.Public | BindingFlags.Static).SetValue(null, '-');
Func<char> getDelimiter =() => Type.Delimiter;
Console.WriteLine(getDelimiter());
इस कोड को मज़बूती से मेरे लिए मैदान के अद्यतन मूल्य से पता चला है: मैं कुछ बेवकूफ करके कि चारों ओर पाने में कामयाब रहे। मैं नहीं कह सकता कि मैं बहुत आश्चर्यचकित हूं; क्षेत्र को केवल पढ़ने के लिए घोषित किया गया है, इसलिए क्षेत्र तक पहुंचने पर जिटर उस धारणा का उपयोग कर सकता है। आप कुछ शरारती और बुरा कर रहे हैं, इस तरह से किसी भी तरह से काम करने के लिए वास्तव में कोई उम्मीद नहीं होनी चाहिए।
अब, क्यों यह दिखाई नहीं था, जब bool.TrueString
क्षेत्र संशोधित करने के लिए के रूप में, मेरी सबसे अच्छी अनुमान है कि यह कारण bool.TrueString
एक संदर्भ प्रकार (string
) जबकि Type.Delimiter
किया जा रहा है एक मान प्रकार (char
) है। मैं कल्पना कर सकता हूं कि यह विभिन्न अनुकूलन को ट्रिगर कर रहा है।
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
आप बहुत स्पष्ट रूप से है कि घबराना शाब्दिक मूल्य '.'
इसकी जगह से दूर अनुकूलित Type.Delimiter
क्षेत्र का उपयोग देख सकते हैं:
मैं इस कोड के लिए disassembly पर देखने के लिए किया था। bool.TrueString
के लिए स्थैतिक क्षेत्र का उपयोग अभी भी वास्तविक फ़ील्ड से लोड होने लगते हैं।
सुनिश्चित नहीं हैं कि शामिल है, एक भयानक विचार की तरह वैसे भी लगता है। – itsme86
स्रोत को देखते हुए दो फ़ील्ड लगभग एक ही घोषित किए जाते हैं लेकिन काफी नहीं, केवल पढ़ने के लिए = "।" होता है, दूसरा केवल पढ़ने के लिए = एक और पढ़ने-केवल शाब्दिक होता है। – pm100
एक जंगली अनुमान।चूंकि बूल एक 'संरचना' है और 'टाइप' एक सार वर्ग है, प्रतिबिंब उस संरचना पर कुछ काला जादू कर सकता है। जैसा कि मैंने कहा .. बस एक अनुमान – lokusking