Access Modifiers in C#

Access Modifiers in C#: किसी Class के सभी Members किसी भी अन्‍य Member को Directly Access कर सकते हैं। लेकिन कोई Class किसी अन्‍य Class के किन Members को Access कर सकता है और किस तरह से Access कर सकता है, इस बात को तय करने के लिए हमें C# द्वारा Provided विभिन्न प्रकार के Access Modifiers का प्रयोग करना पडता है।

Access Modifiers का प्रयोग न केवल विभिन्न प्रकार के C# Supported Types जैसे कि Classes, Interfaces, Structures, Enumerations Delegates के साथ किया जा सकता है, बल्कि इनमें Define किए जाने वाले विभिन्न Members के साथ ही किया जा सकता है। Access Modifiers को हमेंशा Member से पहले Specify किया जाता है। C# में मूल रूप से 5 Access Modifiers को Support किया जाता है।

Public and Private Access Modifiers in C#

Private Members को केवल Class के अन्दर के ही अन्‍य Members Directly Access कर सकते हैं, जबकि अन्‍य Classes किसी भी दूसरी Class के Private Members को Directly Access नहीं कर सकते।

ठीक उसी तरह से जिस तरह से हर व्‍यक्ति का अपना घर हो सकता है, लेकिन एक घर के विभिन्न सदस्; ही उस घर के विभिन्न सामानों को Directly Access कर सकते हैं, जबकि यदि आपका पडौसी आपके घर के किसी सामान को Access करना चाहता है, तो वह आपके घर के किसी सामान को Directly Access नहीं कर सकता।

किसी भी Class के सभी Members Default रूप से Private Access Level में होते हैं। इसलिए यदि हम Class के Members Define करते समय किसी Access Modifier का प्रयोग नहीं करते, तब भी Default रूप से सभी Members Private Access में होते हैं। जैसे:

	class Watch
	{
		//Fields
		byte hour = 12;		//Default Private Access
		private byte minute = 0;	//Explicit Private Access

		. . .
	}

जबकि जिन Members के साथ हम public Access Specifiers का प्रयोग करते हैं, उन Members को किसी भी अन्‍य Class का Object Directly Access कर सकता है। Public Members को हम Global Variable या Global Function की तरह मान सकते हैं, जिसे कोई भी Function कभी भी Access कर सकता है। दूसरे शब्दों में कहें, तो Public Members को हम अपने घर के दरवाजे पर रखे सामान के रूप में मान सकते हैं, जिसे कोई भी अन्‍य व्‍यक्ति Directly उपयोग में ले सकता है।

Private Members Declare करने के लिए हमें Members के साथ private Access Modifier का प्रयोग करना जरूरी नहीं होताए लेकिन जिन Members को हमें Public बनाना होता है, उनके साथ public Access Modifier का प्रयोग करना जरूरी होता है। जैसे:

	class Watch
	{
		//Fields
		public byte hour = 12;		//Explicit Public Access
		public byte minute = 0;		//Explicit Public Access

		//Methods
		void setTime(byte h, byte m);
		void displayTime();
	}

Public Data Members को Current Class के अलावा अन्‍य किसी भी Class के Methods Directly Access कर सकते हैं, जबकि Real World में ऐसा नहीं होता। यानी जिस तरह से Real World में किसी व्‍यक्ति के घर में रखे सामान को कोई भी अन्‍य व्‍यक्ति Directly Access नहीं कर सकताए उसी तरह से किसी Class के किसी भी Data Member को भी कोई भी अन्‍य Class का Method Directly Access नहीं करना चाहिए। इसलिए किसी भी Class के Data Members को कभी भी Public Access में नहीं बल्कि हमेंशा Private Access में रखा जाता है।

लेकिन हम हमारे घर में चाहे जो सामान रखें, अपने घर में आने-जाने के लिए दरवाजा जरूर रखते हैं। ताकि हम उस दरवाजे के माध्‍यम से अपने घर में आ सकें, अपने घर में रखे सामान को Access कर सकें और यदि कोई अन्‍य व्‍यक्ति भी हमारे घर के किसी सामान को Access करना चाहे,तो वह व्‍यक्ति भी हमारे घर के दरवाजे पर आकर किसी सामान के लिए हमसे Request कर सके।

यदि हम घर के अन्दर की वस्तुओं को Private Access में समझें तो घर के बाहर का पूरा Environment Public Access को Represent करेगा और Public तथा Private Access के बीच केवल हमारे घर का दरवाजा ही एक माध्‍यम की तरह काम करता है, जिसके Through घर के अन्दर की चीजों को बाहर Available करवाया जा सकता है।

यदि हम हमारे घर को एक Object व घर के अन्दर रखी चीजों को Object का Data समझें, तो घर के दरवाजे Methods की तरह Represent होंगे। क्योंकि यदि हम हमारे घर में रखे सामान को Access करना चाहते हैं, तो हमें दरवाजे का प्रयोग करना ही होगा, फिर भले ही हम उस दरवाजे का प्रयोग करके अपने लिए अपने घर के सामान को Access करें या फिर अपने पडौसी की किसी Requirement को पूरा करने के लिए अपने घर के सामान को Access करें।

अब यदि हम ये मान लें कि हमारे घर में कोई दरवाजा ही नहीं है, तो उस स्थिति में हम इस तरह के घर के अन्दर रखे किसी सामान को Access नहीं कर सकते, न ही अपनी जरूरत को पूरा करने के लिए न ही अपने किसी पडौसी की जरूरत को पूरा करने के लिए।

क्योंकि घर के अन्दर रखे सामान को Access करने के लिए घर के अन्दर जाने का रास्ता यानी दरवाजा होना जरूरी है और ये दरवाजा ही घर के अन्दर व घर के बाहर के वातावरण को आपस में Connect करता है।

ठीक इसी तरह से किसी Class के Data को Private Access में रखकर हम उस Object के Data को Direct Public Access से तो सुरिक्षत कर लेते हैं, ताकि किसी भी अन्‍य Class के Object का Method इस Data को Directly Access न कर सके। लेकिन यदि हम हमारे Class के Methods को भी Private Access में Declare कर देते हैं, तो इसका मतलब ये हुआ कि हमने हमारी Class के Private Data को किसी भी तरीके से Class से बाहर Public Environment में Access करने से रोक दिया है।

यानी हमने हमारे घर में दरवाजा ही नहीं बनाया है, इसलिए कोई भी अन्‍य व्‍यक्ति हमारे घर में रखे Private Data को Access करने के लिए हमसे किसी भी स्थिति में Request नहीं कर सकता। यहां तक कि हम स्वयं भी यदि अपने घर से बाहर हों, तो अपने ही घर के सामानों को हम स्वयं Access नहीं कर सकते।

जिस तरह से घर के अन्दर के सामानों को घर से बाहर Available करवाने के लिए एक दरवाजे की जरूरत होती है, जो कि घर के अन्दर के वातावरण को घर के बाहर के वातावरण से Connect करते हुए Communication का माध्‍यम Provide करता है, उसी तरह से हर Class Type में ऐसे Methods होने जरूरी होते हैं, जो कि Public Access Level में हों, क्योंकि ये Method ही Class के अन्दर Stored Data को Class के बाहर किसी अन्‍य Object के लिए Available करवाते हैं।

इस Object Oriented Programming System Concept को यदि हम C# Class पर Implement करें, तो हमारी C# Class कुछ निम्नानुसार हो सकती है:

	class Watch
	{
		//Fields
		private byte hour = 12;	
		private byte minute = 0;

		//Methods
		public void setTime(byte h, byte m);
		public void displayTime();
	}

यदि हम एक सरल उदाहरण द्वारा public private Data Members के अन्तर को समझना चाहें, तो हम निम्नानुसार एक Class Define कर सकते हैं:

	class Program
	{
		int Member1;
		private int Member2;	
		public int Member 3;
	}

अब यदि हम इस Class को एक चित्र के रूप में Represent करें, तो हमारा चित्र कुछ निम्नानुसार हो सकता है:

Access Modifiers in C# - Hindi

जैसाकि इस चित्र में हम देख सकते हैं कि चूंकि किसी भी C# Class के सभी Members Default रूप से Private Access में होते हैं, इसलिए हमने Member1 नाम के Data Member के साथ कोई Access Modifier Specify नहीं किया है, फिर भी वह Private Access में है जबकि Member2 के साथ हमने private Keyword का प्रयोग किया है, जिसकी वजह से Member2 भी Private Access में है।

चूंकि Private Members, Outer World के लिए Directly Accessible नहीं होते, इसीलिए उपरोक्त चित्र में दिखाए अनुसार Member1Member2 Program नाम की Class के अन्दर ही Accessible हैं। लेकिन Member3 एक Public Access का Member होने की वजह से वह Class के अन्दर तो Directly Accessible है ही, बल्कि Class के बाहर भी समान रूप से Directly Accessible है। इसीलिए Member3 को चित्र के अन्दर भी दिखाया गया है और बाहर भी।

जैसाकि हमने उपरोक्त Discussion द्वारा समझने की कोशिश की कि किसी Object के Data Members को हमेंशा Private Access में रखा जाना चाहिए, ताकि कोई भी Object किसी दूसरे Object के Data को Directly Access न कर सके और Methods को Public रखा जाना चाहिए, ताकि कोई भी अन्‍य Object इस Method के माध्‍यम से ही Current Object के Data को Access कर सके। लेकिन हमेंशा ये Rule Follow किया जाना जरूरी नहीं होता। कई बार हमें किसी Particular Data Member को Public Access में रखने की भी जरूरत पडती है और कई बार हम किसी Method को Private Access में भी Define करते हैं।

जिस तरह से किसी घर के अन्दर अन्‍य छोटे-छोटे Rooms हो सकते हैं और हर Room का अपना दरवाजा हो सकता है। लेकिन कोई भी External व्‍यक्ति Directly किसी Room के Data को Access नहीं कर सकता। बल्कि वह पहले घर के Main Gate को Access करेगा और Main Gate के माध्‍यम से घर के अन्दर के विभिन्न Rooms के Data को Access किया जा सकेगा। ठीक इसी तरह से जब हम किसी Class में किसी Method को Private Access में Define करते हैं, तब उस Method को केवल उसी Class में Directly Access किया जा सकता है, जबकि वह Private Method Class से बाहर Invisible रहता है।

जबकि यदि कोई External Object इस Private Method को Access करना चाहे, तो वह इन Private Methods (Gate of Rooms) को केवल इसी Class में Define किए गए Public Methods (Main Gate) के माध्‍यम से ही Access कर सकता है।

इसलिए जब हमें Class में कोई ऐसा Method Create करना होता है, जो कि केवल उसी Class के लिए ही उपयोगी हो सकते हैं। तब हम इस प्रकार के Method को Private Method की तरह Define करते हैं।

Accessing Members – Inside and Outside of the Class

जैसाकि हमने पिछले Section में बताया कि किसी भी Class के सभी Members एक दूसरे को Directly Access कर सकते हैं, जबकि Class के केवल Public Access Level वाले Members को ही Class के बाहर किसी अन्‍य Class के Object द्वारा Access किया जा सकता है। इस बात को हम निम्न उदाहरण Program द्वारा बेहतर तरीके से समझ सकते हैं:

// File Name: BoxClassMemberAccess.cs
using System;

namespace CSharpClass
{
    class Box
    {
        double width;
        double height;
        double length;

        private double Volume()
        {
            double volume;
            volume = length * height * width;
            return volume;
        }

        public void SetSize(double h, double l, double w)
        {
            height = h;
            width = w;
            length = l;
        }

        public void Display()
        {
            Console.WriteLine("Height: " + height);
            Console.WriteLine("Width: " + width);
            Console.WriteLine("Length: " + length);
            Console.WriteLine("Volume: " + Volume());
        }
    }

    class UsingBoxClass
    {
        static void Main(String[] arg)
        {
            Box cpuCabinet = new Box();
            cpuCabinet.SetSize(10, 20, 30);
            cpuCabinet.Display();
        }
    }
}

// Output:
   Height: 10
   Width: 30
   Length: 20
   Volume: 6000

इस Program में हमने दो Classes Create की हैं। पहली Class एक Real World Box Object को Represent करता है, जिसे Computer Program में Logically Represent करने के लिए Box की Height, WidthLength Characteristics को Specify किया गया है।

जबकि Box के Dimensions को Set करने के लिए SetSize() व Display करने के लिए हमने Display() नाम के Public Methods Create किए हैं, ताकि जब इसी Program की UsingBoxClass नाम की दूसरी Class cpuCabinet नाम का Box Create करे, तो Box के Dimension को SetSize() Method का प्रयोग करके Newly Create होने वाले Box की Size Set कर सके तथा Display() Method का प्रयोग करके Box के Dimension को Display कर सकें।

इसीलिए जब हम UsingBoxClass में cpuCabinet Object के लिए Box Class में Defined Display() Method को Call करते हैं, तो ये Display() Method Internally निम्नानुसार Statement द्वारा Volume() Method को Directly Access करके उस Box का Volume Display कर देता है, जिसके लिए इसे Call किया गया होता है:

Console.WriteLine(“Volume: ” + Volume());

लेकिन हम इस UsingBoxClass में Box Class में Define किए गए Volume() नाम के Method को cpuCabinet Object के साथ Call नहीं कर सकते, क्योंकि इस Method को हमने Private Access के साथ Define किया है और जब हम किसी Method को Private Access के साथ Define करते हैं, तो उस Method को केवल समान Class में Define किए गए अन्‍य Methods ही Directly Access कर सकते हैं।

इसीलिए Display() Method अपनी समान Class में Define किए गए Volume() नाम के Private Method को Directly उसके नाम से Access कर सकता है, जैसाकि पिछले Statement में दिखाई दे रहा है, लेकिन किसी अन्‍य Class में इन Methods को इसी तरह से Directly Access नहीं किया जा सकता।

अत: यदि हम हमारे पिछले Program में ही UsingBoxClass के Main() Method में निम्नानुसार तरीके से एक और Line Add करते हुए Volume() Method को cpuCabinet Object के साथ Use करना चाहें,

cpuCabinet.Volome();

तो C# Compiler हमें निम्नानुसार एक Error Return करता है:

BoxClassMemberAccess.cs(41,16): error CS0122: ‘CSharpClass.Box.Volume()’ is inaccessible due to its protection level
BoxClassMemberAccess.cs(11,19): (Location of symbol related to previous error)

इस तरह से हम समझ सकते हैं Public Access Members को किसी भी दूसरी Class में Class के Object के माध्‍यम से Access किया जा सकता है, लेकिन Private Access Members को किसी दूसरी Class में Class के Object के माध्‍यम से भी Access नहीं किया जा सकता।

जबकि Private Access Members को समान Class के सभी Members Directly Access कर सकते हैं। यानी समान Class में Object Create करके Methods को Access नहीं करना होताए बल्कि सी/ो ही Members का नाम Specify करके उन्हें Access कर सकते हैं।

इसीलिए UsingBoxClass में Box Class के Public Methods को Access करने के लिए भी हमें Object के नाम के साथ Dot Operator का प्रयोग करके Method के नाम को Specify करना होता है। जबकि Box नाम की Class के सभी Methods Height, WidthLength नाम के तीनों Private Fields को Directly Access करते हैं।

Public Access Specifiers का Types या Members के साथ प्रयोग करने पर वे Types या उनके Members अन्‍य External Types व Derived Classes के लिए बिना किसी Restriction के Publicly Accessible हो जाते हैं। साथ ही समान Type के सभी Members भी Public Access Specifiers के साथ Specified Members को Directly Access कर सकते हैं।

Private Access Specifiers का Types या Members के साथ प्रयोग करने पर वे Types या उनके Members अन्‍य External Types व Derived Classes के पूरी तरह से Restrict हो जाते हैं, जिन्हें कोई भी External Type या Derived Class Directly Access नहीं कर सकताए लेकिन समान Type के सभी Members, इस Private Access Specifiers के साथ Specified Members को बिना किसी Restriction के Directly Access कर सकते हैं।

Protected Access Specifiers का Types या Members के साथ प्रयोग करने पर वे Types या उनके Members समान Type व उनकी Derived Classes के लिए Accessible रहते हैं, लेकिन External Types के लिए Direct Access से पूरी तरह से Restrict हो जाते हैं।

Internal Access Specifiers का Types या Members के साथ प्रयोग करने पर वे Types या उनके Members केवल Current Assembly के अन्दर ही Accessible रहते हैं। इसलिए यदि हम .NET Class Library में Internal Types का पूरा एक Set Define करते हैं, तो अन्‍य Assemblies उन Types को Directly Access नहीं कर सकतीं।

Protected Internal Access Specifiers का Types या Members के साथ प्रयोग करने पर वे Types या उनके Members केवल Current Assembly, Derived Classes व केवल समान Class के अन्दर ही Accessible रहते हैं।

इस तरह से कुल पांच प्रकार के Access Modifiers का प्रयोग विभिन्न प्रकार की जरूरतों को पूरा करने के लिए Types या उनके Members के साथ किया जा सकता है। पिछले कुछ Sections में हमने publicprivate Access Modifiers के बारे में समझने की कोशिश की है। अन्‍य Access Modifiers का प्रयोग C# के अन्‍य Concepts जैसे कि Inheritance में होता है। इसलिए अन्‍य Access Modifiers के बारे में हम तब समझेंगे, जब उनकी जरूरत पडेगी।

Default Access Modifiers in C#

By Default विभिन्न Types के सभी Members Implicitly Private Access Mode में होते हैं जबकि सभी Types Implicitly Internal Access Mode में होते हैं।

इसलिए जब हम कोई Class Define करते समय उसके साथ कोई Access Modifier Specify नहीं करते, तो C# Compiler Automatically उस Class को Internal Access Mode में Define कर देता है, जबकि उसके सभी Members को Default रूप से Private Access Mode में Define कर देता है।

इस तरह से जब हम Type Define करते समय कोई Access Modifier Use नहीं करते, तब उस Type को Current Assembly के सभी Members Directly Access कर सकते हैं, जबकि अन्‍य Assembly के लिए इस Newly Create होने वाले Type के Object पूरी तरह से Restricted रहते हैं।

Access Modifiers and Nested Types

private, protectedprotected internal Access Modifiers का प्रयोग Nested Classes पर भी किया जा सकता है। Nested Types हमेंशा किसी अन्‍य Type के अन्दर यानी किसी अन्‍य Type के Scope में Define किए जाते हैं। जैसे:

	class OuterDemo
	{
		// Data Members
		
		private class InnerDemo
		{
			// Data Members of InnerDemo 
			// Methods of InnerDemo
		}

		. . .
	}

जैसाकि इस Code Segment द्वारा हम समझ सकते हैं कि हम किसी Class Type के अन्दर किसी और Class को Define कर सकते हैं और जब हम ऐसा करते हैं, तो Inner Class के साथ हम private, protected या protected internal Access Modifiers का प्रयोग कर सकते हैं।

लेकिन हम कभी भी किसी Non-Nested Class के साथ private Access Specifiers का प्रयोग नहीं कर सकते। क्योंकि Non-Nested Class तभी बनाया जाता है, जब हम उसे Publicly किसी अन्‍य External Class में Instantiate करके Use करना चाहते हैं। इसलिए यदि हम किसी Non-Nested Class के साथ private Access Specifiers को Use करते हैं, तो C# Compiler हमें Compile Time Error Return करता है।

अत: Non-Nested Class के साथ या तो public Access Specifiers का प्रयोग किया जाता है या उसे Default Access में रखने के लिए किसी Access Specifiers का प्रयोग नहीं किया जाता, ताकि समान Assembly के सभी Members उस Class को Access कर सके।

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

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

BUY NOW GET DEMO REVIEWS