Array Covariance – Array Cloning

Array Covariance

कुछ विशेष परिस्थितियों में हम किसी Object को किसी Array के Element को Assign कर सकते हैं, भले ही वह Object Array के Base Type का न हो। Array की इस विशेषता को Array Covariance कहा जाता है। हम Array Covariance को निम्न परिस्थितियों में Use कर सकते हैं:

  • Array Reference Type का Array हो।
  • Array के Base Type व Array Element को Assign किए जा रहे Object के Type में Implicit या Explicit Conversion हो।

चूंकि Derived Class व उसके Base Class के बीच हमेंशा एक Implicit Conversion होता है, इसलिए हम किसी भी Derived Class के Object को Base Class Array के Element को Assign कर सकते हैं।

हालांकि हम Array को हमेंशा समान Type के Data को Store करने के लिए Declare करते हैं। लेकिन Array वास्तव में .NET Framework का System.Array Class Type होता है। इसलिए हम एक ऐसा Array Create कर सकते हैं, जो कि Elements के रूप में Objects के References को Hold करे और क्योंकि .NET Framework में सबकुछ Object ही होता है, यहां तक कि Primary Data Types भी वास्तव में Internally Types ही होते हैं, इसलिए हम Array में Elements के रूप में किसी भी प्रकार के Data को Store कर सकते हैं।

साथ ही .NET Framework में सभी Types वास्तव में System.Object Type के Derived Types ही हैं, इसलिए Objects के Array में Elements के रूप में विभिन्न प्रकार के अन्‍य Objects को Assign करने पर हमें सामान्‍यत: किसी तरह का Conversion करने की भी जरूरत नहीं होती, क्योंकि सभी Base Types अपने Derived Type को Implicitly Convert कर लेते हैं। Objects का Array Create, Access व Manipulate करने से सम्बंधित विभिन्न Syntaxes को हम निम्न उदाहरण Program द्वारा बेहतर तरीके से समझ सकते हैं:

// File Name: ArrayOfObjects.cs
using System;

namespace CSharpIntermediateConstructsArray
{
    class ArrayOfObjects
    {
        static void Main(string[] args)
        {
            object[] arrayOfObjects = new object[5];
            arrayOfObjects[0] = 1000;
            arrayOfObjects[1] = 10.00;
            arrayOfObjects[2] = true;
            arrayOfObjects[3] = new DateTime(2013, 12, 12);
            arrayOfObjects[4] = "This is string object";

            foreach (object obj in arrayOfObjects)
            {
                Console.WriteLine("Type: {0}, Value: {1}", obj.GetType(), obj);
            }
        }
    }
}

// Output:
   Type: System.Int32, Value: 1000
   Type: System.Double, Value: 10
   Type: System.Boolean, Value: True
   Type: System.DateTime, Value: 12/12/2013 12:00:00 AM
   Type: System.String, Value: This is string object

जैसाकि इस Program द्वारा हम समझ सकते हैं कि हमने Object Type का एक Array Create किया है और Array के विभिन्न Elements के रूप में हमने विभिन्न प्रकार के Data को Store किया है क्योंकि .NET Framework में सबकुछ एक प्रकार का ही Object Type होता है।

इस तरह से हम समझ सकते हैं कि किस तरह से हम एक Array को अलग&अलग प्रकार के Data को Store व Manipulate करने के लिए भी Use कर सकते हैं।

चूंकि .NET का Array एक प्रकार का System.Array Type होता है, जो कि स्वयं .NET Framework की Top Level System.Object Class से Derive होता है। इसलिए System.Array Class हमें बहुत सारे Special PropertiesMethods Provide करता है, जिनका प्रयोग करके हम हमारे Array को विभिन्न तरीकों को Access व Manipulate कर सकते हैं। System.Array Class द्वारा Provided विभिन्न Properties व Methods की Detailed List, Visual Studio के Object Browser Utility द्वारा प्राप्त की जा सकती है।

उदाहरण के लिए यदि हमें Array के सभी Elements को Reverse Order में Retrieve करना हो, तो हम System.Array के reverse() Method को Use कर सकते हैं। इसी तरह से यदि हमें Array के सभी Elements की Sorting करनी हो, तो हम System.Array के sort() Method को Use कर सकते हैं।

Array Cloning

चूंकि हम जानते हैं कि Array एक Reference Type होता है और Reference Type का Actual Data Heap Area में होता है, जबकि उस Heap Area का Address एक Local Variable के रूप में Stack में Stored रहता है।

इसलिए यदि हमें Heap Area के Data को Access करना होता है, तब भी हम Stack के Local Variable में Stored Reference को ही Use करते हैं। इसलिए सामान्‍यत: जब हम किसी Reference Type की Copy करते हैं, तो वास्तव में हम Actual Data की Copy Create नहीं करते बल्कि केवल Reference की ही Copy Create कर रहे होते हैं। जैसे:

// File Name: ObjectCopy.cs
using System;

namespace CSharpIntermediateConstructsArray
{
    class ObjectCopy
    {
        static void Main(string[] args)
        {
            int[] rollnumbers = { 100, 200 };
            int[] numbers = rollnumbers;

            numbers[0] = 300;

            Console.WriteLine("Roll Number[0]: {0}", rollnumbers[0]);
        }
    }
}

// Output:
   Roll Number[0] : 300

इस Program में सबसे पहले हमने rollnumbers नाम का एक Array Create किया और उसमें Index Number 0 पर मान 100 व Index Number 1 पर मान 200 Store किया। फिर हमने numbers नाम का एक और Array Create किया और उसे Value के रूप में rollnumbers नाम के पहले Create किए गए Array को Assign कर दिया।

और जैसाकि हमने पहले कहा कि जब हम एक Reference Type को किसी दूसरे Reference Type को Assign करते हैं, तो वास्तव में हम उस Reference Type के पूरे Data की Copy Create नहीं कर रहे होते हैं, बल्कि हम समान Data के दो Reference Create कर रहे होते हैं। इसलिए उपरोक्त उदाहरण में rollnumbersnumbers दोनों ही समान Heap Area Data को Refer कर रहे हैं।

इसीलिए जब हम number[0] Array Element के मान को Change करके 300 कर देते हैं, तो Automatically rollnumbers Array के भी Index Number 0 पर Stored मान 100 नए मान 300 से Overwrite हो जाता है।

अत: Reference Type के इस Behavior के कारण .NET Framework हमें लगभग सभी .NET Types में Clone() नाम का एक Method Provide करता है। जब हम इस Method को Use करते हैं, तो ये Method केवल Reference की Copy नहीं करता बल्कि पूरे Heap Area Data की Copy करता है। परिणामस्वरूप यदि हम उपरोक्त Program को ही फिर से निम्नानुसार Modify करें%

// File Name: ObjectClone.cs
using System;

namespace CSharpIntermediateConstructsArray
{
    class ObjectClone
    {
        static void Main(string[] args)
        {
            int[] rollnumbers = { 100, 200 };
            int[] numbers = (int[])rollnumbers.Clone();

            numbers[0] = 300;

            Console.WriteLine("Roll Number {0}", rollnumbers[0]);
        }
    }
}

// Output:
   Roll Number[0] : 100

तो जैसाकि हम Output में देख सकते हैं कि इस बार numbers[0] Array Element के मान को Change करने का प्रभाव rollnumbers[0] Array Element के मान पर नहीं पडता। क्योंकि इस बार हमने केवल References का Copy Create नहीं किया है, बल्कि Reference किए जा रहे Heap Area Data का Copy Create किया है।

चूंकि Clone() Method हमेंशा एक Object Return करता है, इसलिए इससे पहले कि हम इसे numbers नाम के Integer Type के Array को Assign करें, हमें इसे Integer Array में Manually Convert करना जरूरी होता है।

इसीलिए हमने Clone() Method से Return होने वाले Object को निम्नानुसार (int[]) Type Casting Statement का प्रयोग करे Integer Type के Array में Convert करके numbers नाम के Array को Assign किया है:

            int[] numbers = (int[])rollnumbers.Clone();

foreach Loop in C#
enum in C#

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW GET DEMO REVIEWS