Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C#

C# में शैलो कॉपी और डीप कॉपी में क्या अंतर है?

शैलो कॉपी (Shallow Copy)

ऑब्जेक्ट की शैलो कॉपी "मुख्य" ऑब्जेक्ट को कॉपी करती है, लेकिन इनर ऑब्जेक्ट्स को कॉपी नहीं करती।

  • इनर ऑब्जेक्ट्स मूल ऑब्जेक्ट और उसकी कॉपी के बीच शेयर किए जाते हैं
  • दोनों ऑब्जेक्ट्स स्वतंत्र नहीं होते
  • यदि एक ऑब्जेक्ट में संशोधन किया जाए, तो परिवर्तन दूसरे में भी प्रतिबिंबित होता है

डीप कॉपी (Deep Copy)

डीप कॉपी ऑब्जेक्ट की पूरी तरह स्वतंत्र कॉपी होती है। यदि हम अपने ऑब्जेक्ट को कॉपी करते हैं, तो हम पूरी ऑब्जेक्ट संरचना को कॉपी करते हैं।

  • संपूर्ण ऑब्जेक्ट ग्राफ़ की नई कॉपी बनती है
  • दोनों ऑब्जेक्ट्स पूरी तरह स्वतंत्र होते हैं
  • एक ऑब्जेक्ट में संशोधन दूसरे को प्रभावित नहीं करता

उदाहरण: अंतर दिखाता हुआ कोड

class Program {
    static void Main(string[] args) {
        // === शैलो कॉपी ===
        Console.WriteLine("=== Shallow Copy ===");
        ShallowCopy obj = new ShallowCopy();
        obj.a = 10;
        
        ShallowCopy obj1 = new ShallowCopy();
        obj1 = obj;  // रेफरेंस असाइनमेंट - शैलो कॉपी!
        
        Console.WriteLine("{0} {1}", obj1.a, obj.a);  // 10, 10
        obj1.a = 5;
        Console.WriteLine("{0} {1}", obj1.a, obj.a);  // 5, 5 - दोनों बदल गए!
        
        // === डीप कॉपी ===
        Console.WriteLine("\n=== Deep Copy ===");
        DeepCopy d = new DeepCopy();
        d.a = 10;
        
        DeepCopy d1 = new DeepCopy();
        d1.a = d.a;  // वैल्यू कॉपी - डीप कॉपी (प्रिमिटिव के लिए)
        
        Console.WriteLine("{0} {1}", d1.a, d.a);  // 10, 10
        d1.a = 5;
        Console.WriteLine("{0} {1}", d1.a, d.a);  // 5, 10 - केवल d1 बदला!
        
        Console.ReadLine();
    }
}

class ShallowCopy {
    public int a = 10;
}

class DeepCopy {
    public int a = 10;
}

आउटपुट

=== Shallow Copy ===
10 10
5 5

=== Deep Copy ===
10 10
5 10

रेफरेंस टाइप्स के साथ वास्तविक अंतर

उपरोक्त उदाहरण प्रिमिटिव (int) का उपयोग करता है जहाँ असाइनमेंट स्वाभाविक रूप से वैल्यू कॉपी करता है। रेफरेंस टाइप्स के साथ अंतर स्पष्ट होता है:

public class Address {
    public string City { get; set; }
}

public class Person {
    public string Name { get; set; }
    public Address Address { get; set; }  // रेफरेंस टाइप
}

// शैलो कॉपी
Person person1 = new Person { Name = "John", Address = new Address { City = "Delhi" } };
Person person2 = person1;  // शैलो कॉपी - समान Address रेफरेंस!

person2.Address.City = "Mumbai";
Console.WriteLine(person1.Address.City);  // "Mumbai" - मूल भी बदल गया!

// डीप कॉपी - मैन्युअल
Person person3 = new Person { 
    Name = person1.Name, 
    Address = new Address { City = person1.Address.City }  // नया Address ऑब्जेक्ट
};

person3.Address.City = "Bangalore";
Console.WriteLine(person1.Address.City);  // "Mumbai" - मूल अपरिवर्तित

डीप कॉपी करने के तरीके

1. मैन्युअल कॉपी (कंस्ट्रक्टर/फैक्टरी)

public class Person {
    public Person DeepCopy() {
        return new Person {
            Name = this.Name,
            Address = new Address { City = this.Address.City }
        };
    }
}

2. ICloneable इंटरफ़ेस

public class Person : ICloneable {
    public object Clone() {
        return this.DeepCopy();
    }
}

3. सीरियलाइज़ेशन (बाइनरी/JSON)

// JSON सीरियलाइज़ेशन (Newtonsoft.Json या System.Text.Json)
string json = JsonSerializer.Serialize(person1);
Person person2 = JsonSerializer.Deserialize<Person>(json);

// बाइनरी सीरियलाइज़ेशन (केवल [Serializable] क्लासेज़ के लिए)
using (var ms = new MemoryStream()) {
    var formatter = new BinaryFormatter();
    formatter.Serialize(ms, person1);
    ms.Position = 0;
    Person person2 = (Person)formatter.Deserialize(ms);
}

4. MemberwiseClone (शैलो कॉपी के लिए बिल्ट-इन)

protected Person ShallowCopy() {
    return (Person)this.MemberwiseClone();
}

तुलना तालिका

पहलूशैलो कॉपीडीप कॉपी
नेस्टेड ऑब्जेक्ट्सशेयर्ड रेफरेंसस्वतंत्र कॉपीज़
मेमोरीकम उपयोगअधिक उपयोग
स्पीडतेज़धीमी
स्वतंत्रतानहींहाँ
जटिलतासरलजटिल (नेस्टेड ग्राफ़ के लिए)

कब क्या उपयोग करें?

  • शैलो कॉपी: केवल प्रिमिटिव फील्ड्स, इम्यूटेबल ऑब्जेक्ट्स, परफॉरमेंस-क्रिटिकल कोड
  • डीप कॉपी: म्यूटेबल रेफरेंस टाइप फील्ड्स, जब स्वतंत्र संशोधन आवश्यक हो
  1. डीप वेब को समझना: सुरक्षित पहुंच युक्तियाँ और अंतर्दृष्टि डीप वेब को समझना: सुरक्षित पहुंच युक्तियाँ और अंतर्दृष्टि

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

  1. स्पीयर फ़िशिंग समझाया गया: हमलों को कैसे पहचानें और रोकें स्पीयर फ़िशिंग समझाया गया: हमलों को कैसे पहचानें और रोकें

    स्पीयर फ़िशिंग क्या है? फ़िशिंग एक प्रकार की धोखाधड़ी गतिविधि है जहां खतरे के कलाकार (थ्रेट एक्टर्स) लुभावने ईमेल, टेक्स्ट मैसेज या फोन कॉल द्वारा अपने पीड़ितों से संपर्क करते हुए खुद को एक वैध इकाई के रूप में प्रस्तुत करते हैं। पीड़ित तब संदेश का जवाब देता है और दिए गए निर्देशों का पालन करता है, यह

  1. स्केयरवेयर समझाया: यह विंडोज पीसी को कैसे धमकाता है और इसे सुरक्षित रूप से कैसे हटाएं स्केयरवेयर समझाया: यह विंडोज पीसी को कैसे धमकाता है और इसे सुरक्षित रूप से कैसे हटाएं

    स्केयरवेयर शब्द किसी भी विज्ञापन या संदेश को संदर्भित करता है जो आपको अनावश्यक सॉफ्टवेयर डाउनलोड या खरीदने के लिए डराने का प्रयास करता है। यह एक ऐसी तकनीक का उपयोग करता है जो आपको चौंकाने और चिंतित करने का प्रयास करती है और यह सोशल इंजीनियरिंग का एक प्रकार है। जब स्केयरवेयर अपने चरम पर होता है, तो य