C# Access Modifiers

Introduction C# Access Modifiers

C# में access modifiers ऐसे keywords होते है जिनके द्वारा आप सभी custom types (class, struct, enum, interface, delegate आदि) और उनके members (variables, properties, methods और events आदि) का access level define करते है।

Access level define करके आप महत्वपूर्ण code को hide करते है और processing के लिए जरुरी code को expose करते है। Access modifiers द्वारा आप object oriented programming का encapsulation feature अपने program में implement कर पाते है।

Access modifiers को types या उनके members को declare करते समय ही define किया जाता है। सभी access modifiers अलग अलग access rules apply करते है।

C# में available access modifiers के बारे में निचे बताया जा रहा है।

public

Public access modifier द्वारा declare किये गए type या members के access पर कोई रोक नहीं होती है। इन्हें class के बाहर कँही भी class का object create करके access किया जा सकता है। ऐसे type या members को derived class द्वारा भी आसानी से access किया जा सकता है।

private

Private access modifier द्वारा declare किये गए type या members को केवल उसी class या struct के अंदर use किया जा सकता है जिसमें उन्हें define किया गया है। Private type या members को class के बाहर object create करके नहीं access किया जा सकता है। इसके अलावा इन्हें derived class द्वारा भी access नहीं किया जा सकता है।

protected

Protected access modifier द्वारा declare किये गए type या members को सिर्फ उसी class के अंदर या फिर उसे derive करने वाली class के अंदर access किया जा सकता है। Protected type या members को class के बाहर object create करके access नहीं किया जा सकता है।

internal

Internal access modifier द्वारा declare किये गए type या members को same assembly में किसी भी code द्वारा access किया जा सकता है। लेकिन assembly के बाहर इन type या members को access नहीं किया जा सकता है।

protected internal

Protected internal access modifier द्वारा declare किये गए type या members को same assembly में कँही भी access किया जा सकता है। ऐसे type या members को दूसरी assembly की derived class में भी access किया जा सकता है।

private protected

Private protected access modifier द्वारा declare किये गए type या members को केवल उसी assembly में access किया जा सकता है जिसमें उन्हें declare किया है और केवल उसी class द्वारा access किया जा सकता है जिसमें उन्हें declare किया गया है। ऐसे type या members को उन types में भी access किया जा सकता है जो उस class को access करते है।

Accessibility of Different C# Types

एक बात आपको हमेशा ध्यान रखनी चाहिए की सभी access modifiers सभी type या members के साथ नहीं use किये जा सकते है। कई बार तो किसी type member का access level उसके containing type द्वारा force किया जाता है।

किसी member की accessibility उसके type से अधिक नहीं होती है जिसमें उसे define किया गया है। किसी member का type कम से कम उतना accessible होना चाहिए जितना वह member खुद है।

उदाहरण के लिए protected class के public members को class के बाहर नहीं access किया जा सकता है। ऐसा करने के लिए class का भी public होना आवश्यक है।

निचे सभी types और members की accessibility बतायी जा रही है।

Class & Struct

यदि आप class declaration के समय access modifier नहीं use करते है तो एक class या struct की default accessibility internal होती है। Class और struct members की default accessibility private होती है।

Class members को ऊपर बताये गए छः में से किसी भी access modifiers के साथ declare किया जा सकता है। Struct members को protected नहीं declare किया जा सकता है क्योंकि struct inheritance को support नहीं करते है। Protected के अलावा आप कोई सा भी access modifier struct members को declare करने के लिए use कर सकते है।

Interfaces

Interfaces को public या internal access modifiers के साथ declare किया जा सकता है। Class और struct की तरह ही interfaces की default accessibility भी internal होती है।

Interface members हमेशा by default public होते है। क्योंकि interface का उद्देश्य दूसरे types द्वारा implement किया जाना होता है। Interface members पर किसी भी प्रकार का access modifier apply नहीं किया जा सकता है।

Enumeration

Enumeration members हमेशा public होते है और उन पर कोई भी access modifier apply नहीं किया जा सकता है।

Delegates

By default delegates का access level internal होता है। लेकिन जब इन्हें nested define किया जाता है तो इनका default access level private होता है।