संपादित करें: मुझे अच्छी तरह से पता है कि यह मूल्य प्रकारों के साथ बहुत अच्छी तरह से काम करता है, मेरा विशिष्ट प्रश्न संदर्भ प्रकारों के लिए इसका उपयोग करने के बारे में है।स्पष्ट संरचना में एक दूसरे के साथ कई सीएलआर संदर्भ फ़ील्ड ओवरलेइंग?
संपादित 2: मुझे यह भी पता है कि आप एक संरचना में संदर्भ प्रकार और मूल्य प्रकारों को ओवरले नहीं कर सकते हैं, यह सिर्फ एक दूसरे के साथ कई संदर्भ प्रकार फ़ील्ड ओवरले करने के मामले में है।
मैं चारों ओर नेट/सी # में structs को संवारता किया गया है, और मैं बस पता चला आप यह कर सकते हैं कि: एक struct का उपयोग करके
using System;
using System.Runtime.InteropServices;
namespace ConsoleApplication1 {
class Foo { }
class Bar { }
[StructLayout(LayoutKind.Explicit)]
struct Overlaid {
[FieldOffset(0)] public object AsObject;
[FieldOffset(0)] public Foo AsFoo;
[FieldOffset(0)] public Bar AsBar;
}
class Program {
static void Main(string[] args) {
var overlaid = new Overlaid();
overlaid.AsObject = new Bar();
Console.WriteLine(overlaid.AsBar);
overlaid.AsObject = new Foo();
Console.WriteLine(overlaid.AsFoo);
Console.ReadLine();
}
}
}
मूल रूप से रनटाइम के दौरान गतिशील कास्टिंग क्या करने वाले को धोखा देने कि एक स्पष्ट फ़ील्ड लेआउट है और फिर ऑब्जेक्ट को सही प्रकार के रूप में एक्सेस कर रहा है।
अब मेरा सवाल है: क्या इससे सीएलआर के अंदर मेमोरी लीक हो सकती है, या कोई अन्य अपरिभाषित व्यवहार हो सकता है? या यह एक पूरी तरह से समर्थित सम्मेलन है जो किसी भी मुद्दे के बिना प्रयोग योग्य है?
मुझे पता है कि यह सीएलआर के गहरे कोनों में से एक है, और यह तकनीक बहुत कम विशिष्ट मामलों में केवल एक व्यवहार्य विकल्प है।
वास्तव में मेरे प्रश्न का उत्तर नहीं दिया। मैं जानना चाहता था कि क्या मैंने पूछा (और _exactly_ जो मैंने पूछा) करना संभव था। एक ही समस्या का कोई अन्य समाधान नहीं है (क्योंकि मेरा उदाहरण यहां सरलीकृत है, वास्तविक समस्या संदर्भ प्रकार का उपयोग नहीं कर सकती है)। – thr
डाउनवोट की व्याख्या करने की देखभाल? यह एक ** गंभीरता से ** जोखिम भरा दृष्टिकोण है; बस कुछ संक्षिप्त कर्सर परीक्षण 'System.SystemException' जैसी चीजें दिखाते हैं - जो ** ** ** ऐसा नहीं लगता है जो आप पेश करना चाहते हैं! एक ** जोखिम ** के रूप में भी। (संदेश विवरण जैसे "" ऑब्जेक्ट इंस्टेंस पर विधि नहीं मिल सका। ") –
@thr - फिर" वर्ग "को" स्ट्रक्चर "में बदलें। यह पोस्ट का महत्वपूर्ण हिस्सा नहीं था; यहां, मैं इसे बदल दूंगा आप ... –