this Keyword in C#

this Keyword in C#: this Keyword को जब हम Class के किसी Method में Use करते हैं, तो वह Method उसी Current Object को Refer करता है, जिसके साथ Dot Operator का प्रयोग करके Method को Invoke किया गया होता है। this Keyword को केवल Instance Constructors, Instance Methods तथा PropertiesIndexers के Instance Accessors में ही Use किया जा सकता है।

चूंकि किसी Class के Static Members, उसकी Class के Objects यानी Instances का Part नहीं होते, इसलिए हम किसी Static Method में this का प्रयोग करके Current Object को Refer नहीं कर सकते, क्योंकि Static Methods कभी किसी Object के साथ Call ही नहीं किए जाते, बल्कि Class के नाम के साथ Call किए जाते हैं। this Keyword को बेहतर तरीके से समझने के लिए हम निम्नानुसार एक उदाहरण Program देख सकते हैं:

File Name: thisKeyword.cs
using System;

namespace CSharpClass
{
    class Watch
    {
        public byte hour { set; get; }
        public byte minute { set; get; }

        public Watch(byte hour = 12, byte minute = 0)
        {
            this.hour = hour;
            this.minute = minute;
        }

        public void DisplayTime()
        {
            Console.WriteLine(hour + ":" + minute);
        }
    }

    class UsingWatchConstructor
    {
        static void Main(String[] arg)
        {
            Watch sonata = new Watch(10, 12);
            Console.Write("Time of the Sonata Watch is: ");
            sonata.DisplayTime();
        }
    }
}

Output:
	Time of the Sonata Watch is: 10:12

जब ये Program Run होता है, तो सबसे पहले sonata नाम का एक Object Create होता है और Create होने वाले sonata Object को Initialize करने के लिए 2-Argument Watch() Constructor Execute होता है। इस Constructor को हमने Watch Class में निम्नानुसार Define किया है:

        public Watch(byte hour = 12, byte minute = 0)

        {

            this.hour = hour;

            this.minute = minute;

        }

चूंकि, this Keyword हमेंशा Current Object को Refer करता है, इसलिए उपरोक्त Code में hour minute नाम के Local Variables, आने वाले Parameter को Represent करते हैं, जबकि this.hourthis.minute Currently Create होने वाले Object के Instance Data Members को Represent करते हैं।

इसलिए Create होने वाले sonata नाम के Object का hour minute Data Member, Parameter के रूप में आने वाले hourminute के मान से Set हो जाते हैं। लेकिन यदि हम उपरोक्त Constructor को बिना this Keyword को उपयोग में लिए हुए निम्नानुसार Define करते हैं:

public Watch(byte hour = 12, byte minute = 0)
{
hour = hour;
minute = minute;
}

तो इस Constructor के Execute होते समय Compiler Confuse हो जाता। उसे लगता कि हम समान Variable को ही समान Variable का मान Assign कर रहे हैं। परिणामस्वरूप हमें एक Error Message प्राप्त होता है।

Using this with Constructors

चूंकि जब हम कोई Class Design करते हैं, तो कई बार उस Class में विभिन्न प्रकार के मानों के आधार पर Object Create करने के लिए विभिन्न प्रकार के Constructors को Define करते हुए Constructors को Overload करना पडता है, जिससे Class की Size काफी बडी हो जाती है। साथ ही सामान्‍यत: Constructors का प्रयोग Object Create करने से पहले Validation Logic Operations Perform करने के लिए भी किया जाता है, ताकि उपयुक्त Data होने पर ही Object Create हो।

इसलिए जब हम Commercial Application Design करते हैं, तब विभिन्न प्रकार के Business Rules को भी Constructors में ही Define किया जाता है। इस स्थिति में अक्सर समान Business Logics को विभिन्न Constructors में बार&बार Repeat करना पडता है, जिससे विभिन्न Constructors के बीच Redundant Validation Logics Create हो जाते हैं। इस प्रकार की Redundancy को Remove करने के लिए भी हम this Operator को Constructor के साथ Mix करके Use कर सकते हैं।

चूंकि this Keyword हमेंशा Current Object को ही Refer करता है। इसलिए this Keyword को Constructors के साथ Use करके हम एक ऐसा Master Constructor बना सकते हैं, जिसमें सभी Business Logics को एक ही बार Specify किया जा सकता है और किसी भी प्रकार का Parameter Specify करके Object Create करने पर Invoke होने वाले सभी Constructors उस एक ही Master Constructor पर ही Forward हो जाते हैं, जहां उस Master Constructor द्वारा ही आने वाले Parameters के आधार पर Best Appropriate Constructor को Invoke किया जाता है।

जब हम Master Constructor Define करना चाहते हैं, तब हमें केवल इतना ही पता लगाना होता है कि सबसे ज्यादा Parameters वाला Constructor कौनसा है और जो Constructor सबसे ज्यादा Parameters Accept करता है, उसी Constructor को Master Constructor की तरह Define किया जाता है और उसी Constructor में सभी Business Logics को Define कर दिया जाता है।

जबकि अन्‍य Constructors this Keyword का प्रयोग करते हुए आने वाले सभी Incoming Parameters को इसी Master Constructor को Forward कर देते हैं और जरूरत होने पर कोई Additional Parameter भी Provide कर देते हैं, जिनके आधार पर Master Constructor Appropriate Action को Perform करने में सक्षम हो जाता है।

इस तरह के Constructor को Use करने पर यदि भविद्ग; में कभी Business Logic में किसी प्रकार का कोई Change होता है, तो हमें Class में Define किए गए सभी Constructors के Business Logic को Modify करने की जरूरत नहीं होती, बल्कि केवल Master Constructor के ही Business Logic को Change करना पडता है, क्योंकि अन्‍य सभी Constructors मूलत: Empty ही होते हैं। Master Constructor के इस Concept को समझने के लिए हम निम्नानुसार एक उदाहरण Create कर सकते हैं:

File Name: thisKeyword4MasterConstructor.cs
using System;

namespace CSharpClass
{
    class Student
    {
        int rollNumber;
        string name;

        public Student() { }

        public Student(int rn) {
            rollNumber = rn;
        }

        public Student(string name) {
            this.name = name;
        }

        public Student(int rn, string name) {
            this.name = name;
            rollNumber = rn;
        }

        public void Display()
        {
            Console.WriteLine("Roll Number: " + rollNumber);
            Console.WriteLine("Name: " + name);
        }
    }

    class UsingStudent
    {
        static void Main()
        {
            Console.WriteLine("First Student Information: ");
            Student stdObj1 = new Student();
            stdObj1.Display();

            Console.WriteLine("\nSecond Student Information: ");
            Student stdObj2 = new Student(100);
            stdObj2.Display();

            Console.WriteLine("\nThird Student Information: ");
            Student stdObj3 = new Student("Kuldeep Mishra");
            stdObj3.Display();

            Console.WriteLine("\nFourth Student Information: ");
            Student stdObj4 = new Student(200, "Kuldeep Mishra");
            stdObj4.Display();
        }
    }
}

// Output:
   First Student Information: 
   Roll Number: 0
   Name: 

   Second Student Information: 
   Roll Number: 100
   Name: 

   Third Student Information: 
   Roll Number: 0
   Name: Kuldeep Mishra

   Fourth Student Information: 
   Roll Number: 200
   Name: Kuldeep Mishra

जैसाकि इस Program में हम देख सकते हैं कि हमने कुल 4 अलग Constructors को Define किया है और Main() Method में चारों ही Constructors के माध्‍यम से चार अलग Objects Create किया है। जिसकी वजह से चारों ही Constructors में Name या Roll Number का Repetition हो रहा है। अब इसी Program को हम निम्नानुसार this Keyword का प्रयोग करते हुए एक Master Constructor द्वारा समान Output प्राप्त करने के लिए Redesign कर सकते हैं:

File Name: thisKeyword4MasterConstructorImplementation.cs
using System;

namespace CSharpClass
{
    class Student
    {
        int rollNumber;
        string name;

        public Student() { }
        public Student(int rn) : this(rn, "") { }
        public Student(string name) : this(0, name) { }

        public Student(int rn, string name)
        {
            this.name = name;
            rollNumber = rn;
        }

        public void Display()
        {
            Console.WriteLine("Roll Number: " + rollNumber);
            Console.WriteLine("Name: " + name);
        }
    }

    class UsingStudent
    {
        static void Main()
        {
            Console.WriteLine("First Student Information: ");
            Student stdObj1 = new Student();
            stdObj1.Display();

            Console.WriteLine("\nSecond Student Information: ");
            Student stdObj2 = new Student(100);
            stdObj2.Display();

            Console.WriteLine("\nThird Student Information: ");
            Student stdObj3 = new Student("Kuldeep Mishra");
            stdObj3.Display();

            Console.WriteLine("\nFourth Student Information: ");
            Student stdObj4 = new Student(200, "Kuldeep Mishra");
            stdObj4.Display();
        }
    }
}

Output:
First Student Information: 
Roll Number: 0
Name: 

Second Student Information: 
Roll Number: 100
Name: 

Third Student Information: 
Roll Number: 0
Name: Kuldeep Mishra

Fourth Student Information: 
Roll Number: 200
Name: Kuldeep Mishra

जैसाकि हम इस Program के Output द्वारा समझ सकते हैं कि इस Program का Output भी Exactly पिछले Program के Output के समान ही है, लेकिन इस Program में हमने निम्नानुसार केवल एक ही Master Constructor Create किया है, जबकि सभी अन्‍य Constructors को निम्नानुसार तरीके से 2-Argument Constructor पर ही Forward कर दिया है।

परिणामस्वरूप हम देख सकते हैं कि इस Program के Constructors में किसी Code का Repetition नहीं हो रहा है। इसलिए यदि भविष्‍य में कभी किसी Logic में Change किया जाता है, तो हमें केवल Master Constructor को ही Modify करना होगा, जबकि अन्‍य सभी Constructors ज्यों के त्यों रहेंगे।

यदि हम इस तरीके को Use करते हुए Programming करते हैं, तो हमारा Program .NET के किसी भी Version के Platform के लिए समान रूप से Run होता है। लेकिन यदि हम .NET 4.0 के लिए Program Create करते हैं, तो फिर हम Optional Parameters (Default Parameters) Specify करते हुए भी समान Requirement को पूरा कर सकते हैं, जैसाकि हमने Constructors को समझते समय किया था।

Constructor in C#
Indexer 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