c# - Can a readonly field in .NET become null? -
मेरे पास एक मल्टीथ्रेडेड ऐप में एक अजीब बग है:
पब्लिक क्लास मायक्लास {निजी रीडॉनली हैशटेबल एचशप्रफेस; सार्वजनिक MyClass (इंट आईडी) {HashPrefs = नया हैशटेबल (); } सार्वजनिक शून्य SomeMethodCalledFromAnotherThread (स्ट्रिंग hashKey, स्ट्रिंग hashValue) {अगर (HashPrefs.Contains (hashKey)) // & lt; - फेंकता NullReferenceException {}}}
एक थ्रेड करता है: < / P>
कुछकुछ। जोड़ें (नया MyClass (1));
और एक और धागा करता है:।
SomeQueue.Dequeue () SomeMethodCalledFromAnotherThread (SomeClass.SomeMethod (), "स्थिरांक मूल्य");
लेकिन कंस्ट्रक्टर समाप्त होने से पहले दूसरी धागा विधि को कैसे बुला सकता है?
संपादित करें: मैंने फ़ंक्शन पैरामीटर के साथ हिस्सा जोड़ा, जैसा कि ऐसा लगता है प्रासंगिक। जहाँ तक मेरा बता सकते हैं, hashKey SomeMethod (के रूप में पर पारित किया जा रहा नल नहीं हो सकता,) हमेशा एक प्रासंगिक स्ट्रिंग देता है।
के रूप में अन्य लोगों, ने बताया है कि समस्या एक अशक्त haskKey पैरामीटर के लिए पारित कर दिया था शामिल हैं (), अपवाद ArgumentNullException होगा।
प्रतिबिंब एक तरह से यह ( क्या करना है SetField
)।
इस जिज्ञासा प्राप्त करने के लिए एक दूसरा तरीका अगर आप बहुत जल्दी संदर्भ दे देना, पास करके है इस
(या sometihng एक अंतर्निहित शामिल
.ctor
:
सार्वजनिक MyClass (int आईडी) {प्रोग्राम से बाहर] एक
, इस तरह के एक अज्ञात विधि / लैम्ब्डा में कब्जा कर लिया क्षेत्र के रूप में। टेस्ट (this); // उफ़ी ;- पी एचशप्रेफ्स = नया हैशटेबल (); }
या अधिक संभावना (सवाल दिया गया):
कुछकुछ। जोड़ें (यह);
एक अन्य प्रासंगिक प्रश्न हो सकता है - क्या इसे पहली जगह पर नहीं सौंपा जा सकता है? और इसका जवाब हां है, खासकर यदि आप सीरियलाइजेशन का उपयोग कर रहे हैं लोकप्रिय विश्वास के विपरीत, आप वास्तव में निर्माता को बाईपास कर सकते हैं, यदि आपके पास कोई कारण है; DataContractSerializer
करता है कि इस ...
निम्नलिखित एक पैदा करेगा कुछ का एक अच्छा उदाहरण है MyClass
एक अशक्त क्षेत्र के साथ:
MyClass obj = (MyClass) सिस्टम। समयबद्धता। सेरिअलाइज़ेशन.फ़ॉर्मरसर्विसेस। GetUninitializedObject (typeof (MyClass));
Comments
Post a Comment