c# - सी#memcpy बराबर




serialization copying (6)

मेरे पास एक ही प्रकार से 2 ऑब्जेक्ट हैं और मैं एक राज्य को दूसरे राज्य में छीलने के लिए उथले करना चाहता हूं। सी ++ में मेम्पीपी है जो महान है। मैं सी # में कैसे कर सकता हूँ? सदस्यत्वपूर्ण क्लोन () काफी अच्छा नहीं है क्योंकि यह एक नया ऑब्जेक्ट बनाता है और रिटर्न करता है और मैं किसी मौजूदा ऑब्जेक्ट की कॉपी करना चाहता हूं। मैंने प्रतिबिंब का उपयोग करने के बारे में सोचा, लेकिन मुझे डर है कि यह उत्पादन कोड के लिए बहुत धीमा होगा मैंने भी एक। नेट serializers का उपयोग करने के बारे में सोचा था लेकिन मुझे लगता है कि वे मौजूदा एक को सेट करने के बजाय ऑब्जेक्ट भी बनाते हैं।

मेरा उपयोग केस:

मेरे पास टेम्पलेट ऑब्जेक्ट (क्लास नॉट स्ट्रेट) है, जिसे इसके एक उदाहरण (इस टेम्प्लेट से बनाए गए ऑब्जेक्ट्स) द्वारा अपडेट किए जाने की आवश्यकता है

कोई विचार?


किसी अन्य संरचना के लिए एक स्ट्रिंग का असाइनमेंट, सभी उद्देश्यों और प्रयोजनों के लिए, POD ऑब्जेक्ट पर सी ++ में memcpy तरह काम करता है

अगर आपको लगता है कि यह आपकी स्थिति पर लागू नहीं होता है तो मैं आपको आश्वासन दे सकता हूं कि आपका C ++ कोड मानक-अनुरूप नहीं था (अर्थात, अपरिभाषित व्यवहार के रूप में निहित बग) कृपया ( प्रश्न में ) निर्दिष्ट करें कि आप क्या हासिल करना चाहते हैं। यह किसी अन्य भाषा में अपरिभाषित व्यवहार को दोहराने के बारे में बात करने के मुकाबले अधिक उपयोगी होगा।


जब मैं इसके बारे में सोचता हूं - सदस्य वर्सेक्लोन () विधि कार्यान्वयन के कोड को देखने के लिए बहुत दिलचस्प है और देखें कि माइक्रोसॉफ्ट ने मेरे प्रश्न का हल कैसे किया


मैं एक नव निर्मित ऑब्जेक्ट का उपयोग नहीं कर सकता क्योंकि मैं अपने इंस्टेंसेस (यानी टेम्पलेट से बना हुआ उदाहरण) की स्थिति के अनुसार टेम्पलेट ऑब्जेक्ट को बदलना चाहता हूं


C# (और C++ भी), "नए ऑब्जेक्ट" और "मौजूदा ऑब्जेक्ट की प्रतिलिपि" में कोई अंतर नहीं है, जब तक कि उनके सभी सदस्यों को एक दूसरे के बराबर नहीं मिलते।

दिया हुआ:

Int32 a = 5;

, दोनों कार्यों:

Int32 b = 5;
Int32 b = a;

एक ही परिणाम उपज

जैसा कि MSDN संदर्भ में कहा गया है:

सदस्यत्वविहीन विधि एक नई ऑब्जेक्ट बनाकर एक उथले प्रतिलिपि बनाता है, और फिर वर्तमान ऑब्जेक्ट के नॉनस्टेटिक फ़ील्ड को नए ऑब्जेक्ट पर कॉपी कर रहा है।

अगर कोई फ़ील्ड वैल्यू टाइप है, तो फ़ील्ड की बिट-बाय-बिट प्रतिलिपि बनाई जाती है।

अगर कोई फ़ील्ड एक संदर्भ प्रकार है, तो संदर्भ कॉपी होता है लेकिन संदर्भित ऑब्जेक्ट नहीं है; इसलिए, मूल वस्तु और उसके क्लोन एक ही ऑब्जेक्ट को देखें।

, अर्थात यह C++ में memcpy() के समान C++


namespace WindowsFormsApplication7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            var dt = new DataTable();
            dt.Columns.Add("lastname", typeof(string));
            dt.Columns.Add("firstname", typeof(string));

            dt.Rows.Add("lennon", "john");
            dt.Rows.Add("mccartney", "paul");


            var ms = new MemoryStream();
            var bf = new BinaryFormatter();
            bf.Serialize(ms, dt);
            byte[] bytes = ms.ToArray();



            var bfx = new BinaryFormatter();
            var msx = new MemoryStream();
            msx.Write(bytes, 0, bytes.Length);
            msx.Seek(0, 0);


            // doesn't just copy reference, copy all contents
            var dtx = (DataTable)bfx.Deserialize(msx);


            dtx.Rows[0]["lastname"] = "Ono";


            // just copy reference
            var dty = dt;

            dty.Rows[0]["lastname"] = "Winston";

            MessageBox.Show(dt.Rows[0]["lastname"].ToString()); // Winston
            MessageBox.Show(dtx.Rows[0]["lastname"].ToString()); // Ono
            MessageBox.Show(dty.Rows[0]["lastname"].ToString()); // Winston

        }
    }
}

आपके स्पष्टीकरण के बारे में [संपादित करें]: जैसा कि मैं समझता हूं, आपके पास एन ऑब्जेक्ट्स हैं, प्रत्येक में टेम्पलेट ऑब्जेक्ट का एक (प्रत्यक्ष) संदर्भ है आप टेम्पलेट पर वापस लिखना चाहते हैं ताकि सभी ऑब्जेक्ट इन परिवर्तनों को "देखें"

सुझाव: एक टेम्पलेट ब्रोकर को लागू करें

class TemplateProvider
{
   public MyData Template { get; set; }
}

टेम्पलेट पास करने के बजाय, टेम्पलेट प्रदाता ऑब्जेक्ट को पास करें।

घटकों में सिंटैक्स को बस करने के लिए, आप एक (निजी / आंतरिक?) संपत्ति जोड़ सकते हैं

MyData Template { get { return m_templateProvider.Template; } }
void UpdateTemplate() { m_templateProvider.Template = 
                            (MyData) this.MemberwiseClone(); }

टेम्पलेट प्रदाता मल्टी थ्रेड परिदृश्यों में लॉकिंग को सरल करता है।

संक्षेप में, कोई रास्ता नहीं जब तक आप इसे स्वयं नहीं करते हैं लेकिन यदि आप सभी गुणों को वैसे ओवरराइड करते हैं तो एक नया ऑब्जेक्ट क्यों नहीं बनाते?

memcopy और इसी तरह के निम्न स्तर के निर्माण समर्थित नहीं हैं क्योंकि वे पर्यावरण द्वारा की गई गारंटियां कम कर देते हैं।

स्ट्रैक्ट्स के लिए एक उथले प्रतिलिपि असाइनमेंट द्वारा की जाती है। वर्गों के लिए, MemberwiseClone से MemberwiseClone ऐसा करने का तरीका है - लेकिन जैसा कि आप कहते हैं कि एक नया ऑब्जेक्ट बनाता है

इसके लिए कोई रास्ता नहीं बनाया गया है, और जैसा कि संभवतः इनकैप्सुलेशन तोड़ता है, इसका उपयोग किसी भी तरह से देखभाल के साथ किया जाना चाहिए।

आप रिफ्लेक्शन का इस्तेमाल करते हुए जेनेरिक रूटीन बना सकते हैं, लेकिन यह काम करता है या नहीं, यह क्लास पर निर्भर करता है। और हाँ, ती तुलनात्मक रूप से धीमी हो जाएगी

क्या बचा है यह एक कस्टम इंटरफ़ेस द्वारा समर्थित है। आप एक सामान्य "उथला प्रतिलिपि" दिनचर्या प्रदान कर सकते हैं जो अंतरफलक के लिए जांचता है और इसका उपयोग करता है, और जब प्रतिबिंब नहीं आता है, यह सामान्य रूप से उपलब्ध कार्यक्षमता को बनाता है, और आप उन वर्गों को अनुकूलित कर सकते हैं जिनके लिए प्रदर्शन महत्वपूर्ण है।







copying