Extension Methods in C#

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

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

BUY NOW DOWNLOAD READ ONLINE

Extension Methods in C#: अभी तक हमने जितने भी Methods Create किए हैं, वे सभी केवल उसी Class के Objects के लिए Accessible होते हैं, जिनमें इन्हें Define किया जाता है। लेकिन C# का Extension Method ऐसा Method होता है, जो एक से ज्यादा Classes के Objects के बीच Share हो सकता है और एक से ज्यादा Classes के Objects के लिए Call किया जा सकता है।

इस प्रकार के Method की उपयोगिता को समझने के लिए हम निम्नानुसार एक Example Program Create कर सकते हैं, जहां MyData नाम की Class Double Type के तीन Data Members D1, D2D3 को Store कर रहा है और Sum() नाम के Method द्वारा तीनों ही Data Members के योग को Return कर रहा है, जबकि Class के Constructor का प्रयोग Data Members को Initialize करने के लिए किया जा रहा है:

    class MyData
    {
        private double D1; // Fields
        private double D2;
        private double D3;

        public MyData(double d1, double d2, double d3) 	// Constructor
        {
            D1 = d1; D2 = d2; D3 = d3;
        }

        public double Sum() 				// Method Sum
        {
            return D1 + D2 + D3;
        }
    }

जैसाकि इस Class में हम देख सकते हैं कि ये Class काफी Limited Services Provide कर रहा है। यदि मानलो कि हम इस Class द्वारा सभी Data Members के मानों का Average() भी प्राप्त करना चाहते हैं, तो हम इस जरूरत को कई तरीकों से पूरा कर सकते हैं।

  • यदि हमारे पास Class का Source Code हो, तो हम उस Source Code को Modify करते हुए उसमें Average() नाम का एक नया Method Define कर सकते हैं।
  • यदि हमारे पास Class का Source Code उपलब्‍ध न हो, तो हम Class को Inherit करते हुए नई Functionalities को Derived Class में Define कर सकते हैं।

लेकिन मानलो कि न तो हमारे पास इस Class का Source Code है न ही हम इस Class को Inherit कर सकते हैं, क्योंकि ये Class Sealed यानी अपनी Inheritance Hierarchy की अन्तिम Class है। जिसकी वजह से हम न तो इस Class को Modify कर सकते हैं न ही इसे Derive कर सकते हैं और इस Class के Data Members भी Public Access में नहीं होने की वजह से हम Data Members को भी Directly Access नहीं कर सकते।

हालांकि हमारी MyData Class के साथ उपरोक्त Restrictions हैं, लेकिन फिर भी C# में हम Static Class Define कर सकते हैं और इस Static Class निम्नानुसार Average() नाम का Method Create कर सकते हैं:

File Name: ExtensionMethod.cs
using System;

namespace CSharpInterface
{
    class MyData
    {
//Same as above
    }

    static class ExtendMyData
    {
        public static double Average(MyData md)
        {
            return md.Sum() / 3;
        }
    }

    class UsingExtendMyData
    {
        public static void Main()
        {
            MyData md = new MyData(3, 4, 5);
            Console.WriteLine("Average: {0}", ExtendMyData.Average(md));
        }
    }
}

Output:
	Average: 4

हालांकि ये तरीका काफी उपयुक्त है और इस तरीके का प्रयोग करते हुए भी हम एक Sealed Class की Functionality को Increase कर सकते हैं। लेकिन जैसा कि हम देख सकते हैं कि Average Create करने के लिए हमें Static Class के नाम के साथ Average Method को Call करना पडता है।

जबकि यदि हम इस Method को MyData Class को Inherit करके या MyData Class के Source Code को Modify करके Specify करते, तो हम इस Method को Object के नाम के साथ Dot Operator का प्रयोग करके Use कर पाते, जो कि ज्यादा Familiar तरीका होता। यानी यदि हम निम्न Statement को-

Console.WriteLine(“Average: {0}”, ExtendMyData.Average(md));

निम्नानुसार लिख पाते-

Console.WriteLine(“Average: {0}”, md.Average());

तो हालांकि MyData एक पूरी तरह से Sealed Class है, फिर भी हम इस Class में Virtually Average नाम के Method को Add कर पाते। यानी हमें ऐसा ही लगताए जैसे कि हमने MyData नाम की Class में ही Average() नाम के Method को Define किया है।

Extension Method हमें यही करने की सुविधा Provide करता है। यानी Extension Method का प्रयोग करके हम एक Sealed Class के लिए ऐसा Method Define करने की क्षमता प्राप्त कर लेते हैं, जिसमें Method को तो किसी और Class में Define किया जाता है, लेकिन हम उसे उस Sealed Class के किसी Object के साथ ठीक उसी तरह से Use करने में सक्षम हो जाते हैं, जैसे कि हमने उस Method को उस Sealed Class के अन्दर ही Define कर दिया हो।

यानी किसी एक Class में Define किए गए Method को किसी दूसरी Class के लिए भी समान प्रकार से Use करने की क्षमता प्राप्त करने हेतु हम Extension Method Define कर सकते हैं और उपरोक्तानुसार Define किए गए किसी Static Method को Extension Method के रूप में Convert करने के लिए हमें निम्नानुसार काफी मामूली सा परिवर्तन करना पडता है:

File Name: ExtensionMethodImplementation.cs
using System;

namespace CSharpInterface
{
    class MyData
    {
      //Same as above
    }

    static class ExtendMyData
    {
        public static double Average(this MyData md)
        {
            return md.Sum() / 3;
        }
    }

    class UsingExtendMyData
    {
        public static void Main()
        {
            MyData md = new MyData(3, 4, 5);
            Console.WriteLine("Average: {0}", ExtendMyData.Average(md));
            Console.WriteLine("Average: {0}", md.Average());
        }
    }
}
Output:
	Average: 4 
	Average: 4

इस Program में हमने केवल अपने Define किए गए Average() Method में निम्नानुसार केवल एक this Keyword का प्रयोग किया है:

public static double Average(this MyData md)

और इतने से Change से हम हमारे Program में निम्नानुसार Statement Specify करने की सुविधा प्राप्त कर लेते हैं:

Console.WriteLine(“Average: {0}”, md.Average());

हालांकि Average() Method को हमने एक अलग Class में Define किया है, जो कि MyData Class से पूरी तरह से अलग है।

यदि कोई Method निम्न Requirement को पूरा करता है, तो हम इस प्रकार के Method को Extension Method मान सकते हैं:

  • जिस Class में Extension Method को Define किया जाता है, वह Class Static होनी चाहिए।
  • स्वयं Extension Method का भी Static होना जरूरी होता है।
  • इस Extension Method का पहला Parameter this होना जरूरी होता है।

यदि हमारा कोई Method इन तीनों Requirements को पूरा करता है, तो इस तरह का Method एक प्रकार का Extension Method होता है, जिसे हम उस Class के Object के साथ Dot Operator का प्रयोग करके Member Method के रूप में Use कर सकते हैं, जिसके Object को Extension Method में Parameter के रूप में Pass किया गया होता है।

यानी यदि हम इसी Average() Method में MyData Class के स्थान पर किसी और Class का नाम Specify कर दें, तो उस Specified Class के Objects के साथ भी हम Dot Operator का प्रयोग करके Average() Method को Call कर सकते हैं।

Sealed Class in C#
C# Internal Class - Inner Class - Nested Class

******

ये पोस्‍ट Useful लगा हो, तो Like कर दीजिए।

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

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

BUY NOW DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।