आप शायद चेतावनी CS1690, रेप्रो कोड के बारे में बात कर रहे हैं:
public class Remotable : MarshalByRefObject {
public int field;
}
public class Test {
public static void Run() {
var obj = new Remotable();
// Warning CS1690:
Console.WriteLine(obj.field.ToString());
}
}
एक दूरस्थ परिदृश्य में, Test.Run विधि Remotable वस्तु के एक प्रॉक्सी के साथ काम करेंगे। किसी संपत्ति, विधि या घटना के लिए प्रॉक्सी बनाना कोई समस्या नहीं है, केवल एक विधि बनाने योग्य है जिसमें विकल्प शामिल हैं। फ़ील्ड एक समस्या है हालांकि, 'हुक' करने के लिए कुछ भी नहीं है। एमबीआरओ के लिए, जेआईटी कंपाइलर अब सीधे क्षेत्र तक पहुंचने के लिए कोड उत्पन्न नहीं करता है, यह इस मामले में सीएलआर, JIT_GetField32() में निर्मित एक सहायक विधि के लिए कॉल इंजेक्ट करता है।
वह सहायक जांच करता है कि ऑब्जेक्ट प्रॉक्सी है और रिमोट वैल्यू प्राप्त करने के लिए रीमोटिंग प्लंबिंग का उपयोग करता है यदि ऐसा है। या अगर यह नहीं है तो सीधे क्षेत्र को सीधे एक्सेस करता है। ToString() कॉल करना हालांकि मूल्य को बॉक्स किए जाने की आवश्यकता है। यह एक समस्या है, मुक्केबाजी प्रॉक्सी से मूल्य अलग करता है। यह सुनिश्चित करने का कोई तरीका नहीं है कि बॉक्स किए गए मान हमेशा रिमोट किए गए मान की एक सटीक प्रति है। जब भी ToString() विधि स्ट्रिंग को प्रारूपित करने के लिए मान का उपयोग करती है तो JIT_GetField32() को कॉल करना संभव नहीं है।
सीएस 16 9 0 के लिए कामकाज सरल है, एक संपत्ति के साथ क्षेत्र को लपेटने से परे, बस स्थानीय चर में फ़ील्ड मान की प्रतिलिपि बनाएँ। अब यह क्रिस्टल स्पष्ट है कि कोड एक प्रतिलिपि के साथ काम कर रहा है और कभी आश्चर्य नहीं होता है इसलिए संकलक को चेतावनी को छोड़ना नहीं होगा।
public static void Run() {
var obj = new Remotable();
var value = obj.field;
Console.WriteLine(value.ToString()); // No warning
}
स्रोत
2010-11-14 18:56:02
संदर्भ क्या है जहां आपको यह चेतावनी मिलती है? –