ุงู„ู€ Access ModifiersุŒ ุฃูˆ ุฒูŠ ู…ุง ุจูŠุชุณู…ูˆุง ุจุฑุถู‡ Access SpecifiersุŒ ู‡ู…ุง ุนุจุงุฑุฉ ุนู† C# Keywords ุจุชุณุงุนุฏู†ุง ู†ุญุฏุฏ ู†ุทุงู‚ ุงู„ูˆุตูˆู„ ุฃูˆ ุงู„ุฑุคูŠุฉ (accessibility scope). ุจุจุณุงุทุฉุŒ ู‡ู…ุง ุงู„ู„ูŠ ุจูŠุญุฏุฏูˆุง ู…ูŠู† ูŠู‚ุฏุฑ ูŠุณุชุฎุฏู… ุฃูˆ ูŠุดูˆู type ู…ุนูŠู† (ุฒูŠ class ุฃูˆ struct) ุฃูˆ ุนุถูˆ ู…ุนูŠู† (ุฒูŠ method ุฃูˆ variable) ูˆู…ูŠู† ู„ุฃ.

ููŠ ู„ุบุฉ C#ุŒ ุฅุญู†ุง ุจู†ูƒุชุจ ุงู„ูƒูˆุฏ ุจุชุงุนู†ุง ุฌูˆู‡ NamespaceุŒ ูˆุฌูˆู‡ ุงู„ู€ namespace ุฏู‡ ุจู†ุนุฑู types ู…ุฎุชู„ูุฉ ุฒูŠ:

ูˆุฌูˆู‡ ุงู„ู€ Types ุฏูŠุŒ ุจู†ูƒุชุจ ุฃุนุถุงุก (members) ุฒูŠ ุงู„ู€ functions ูˆุงู„ู…ุชุบูŠุฑุงุช ูˆุบูŠุฑู‡ุง. ุงู„ู€ Access Modifiers ู‡ูŠ ุงู„ู„ูŠ ุจุชุฌุงูˆุจ ุนู„ู‰ ุณุคุงู„: โ€œุงู„ุญุงุฌุงุช ุฏูŠ ู‡ุชุจู‚ู‰ ู…ุชุงุญุฉ ู„ู„ูˆุตูˆู„ ู„ุญุฏ ููŠู† ุจุงู„ุธุจุทุŸ ู‡ู„ ุฌูˆู‡ ุงู„ู€ Library (ุงู„ู…ุดุฑูˆุน) ุจุณุŒ ูˆู„ุง ู„ูˆ ุญุฏ ุงุณุชุฎุฏู… ุงู„ู€ Library ุฏูŠ ููŠ ู…ุดุฑูˆุน ุชุงู†ูŠ ู‡ูŠู‚ุฏุฑ ูŠูˆุตู„ู‡ุง ุจุฑุถู‡ุŸโ€œ.

Types of Access Modifiers

ู„ุบุฉ C# ุจุชุฏุนู… 6 ุฃู†ูˆุงุน ู…ู† ุงู„ู€ Access Modifiers:

  1. Public
  2. Private
  3. Protected
  4. Internal
  5. Protected Internal
  6. Private Protected
  7. file new access modifier

ุงู„ู€ Members ุงู„ู„ูŠ ู…ุชุนุฑูุฉ ุฌูˆู‡ type ู…ุนูŠู† ุจุชูƒูˆู† ุฏุงูŠู…ู‹ุง ู…ุชุงุญุฉ ู„ู„ูˆุตูˆู„ ู…ู† ุฌูˆู‡ ู†ูุณ ุงู„ู€ type ุฏู‡ุŒ ุจุบุถ ุงู„ู†ุธุฑ ุนู† ุงู„ู€ Access Modifier ุจุชุงุนู‡ุง. ุงู„ู‚ูŠูˆุฏ ุจุชุธู‡ุฑ ุจุณ ู„ู…ุง ุจู†ุญุงูˆู„ ู†ูˆุตู„ ู„ู„ุนุถูˆ ุฏู‡ ู…ู† ุจุฑู‡ ุงู„ู€ type.

Detailed Breakdown of Each Access Modifier

ุฎู„ูŠู†ุง ู†ูุตุต ูƒู„ ูˆุงุญุฏ ููŠู‡ู… ุจุงู„ุชูุตูŠู„.

1. Public

  • ุงู„ุดุฑุญ: ู†ู‚ุฏุฑ ู†ูˆุตู„ู‡ ู…ู† ุฃูŠ ู…ูƒุงู† ููŠ ุงู„ุจุฑู†ุงู…ุฌ ุจุฏูˆู† ุฃูŠ ู‚ูŠูˆุฏุŒ ุณูˆุงุก ุฌูˆู‡ ู†ูุณ ุงู„ู€ Assembly (ุงู„ู…ุดุฑูˆุน) ุฃูˆ ู…ู† ุฃูŠ Assembly ุชุงู†ูŠ.
  • ู…ุซุงู„:
public class MyClass
{
	public int myVar = 5;
}
 
class Program
{
	static void Main()
	{
		MyClass obj = new MyClass();
		// Accessible from anywhere
		Console.WriteLine(obj.myVar);
	}
}

2. Private

  • ุงู„ุดุฑุญ: ู†ู‚ุฏุฑ ู†ูˆุตู„ู‡ ูู‚ุท ุฌูˆุง ู†ูุณ ุงู„ูƒู„ุงุณ ุฃูˆ ุงู„ู€ Struct ุงู„ู„ูŠ ู‡ูˆ ู…ุชุนุฑู ุฌูˆุงู‡. ุฏู‡ ุฃูƒุชุฑ ู†ูˆุน ู…ู‚ูŠุฏ ููŠู‡ู….
  • ุงู„ุนู„ุงู…ุฉ ููŠ ุงู„ู€ IDE: ุงู„ู€ Member ุจูŠุจู‚ู‰ ุนู„ูŠู‡ ุดูƒู„ ู‚ูู„.
  • ู…ุซุงู„:
public class MyClass
{
	private int myVar = 5;
 
	public void ShowVar()
	{
		// Accessible only inside this class
		Console.WriteLine(myVar); 
	}
}
 
class Program
{
	static void Main()
	{
		MyClass obj = new MyClass();
		obj.ShowVar(); // This works
		// obj.myVar = 10; // This would cause a compile-time ERROR
	}
}

3. Protected

  • ุงู„ุดุฑุญ: ู†ู‚ุฏุฑ ู†ูˆุตู„ู‡ ุฌูˆุง ู†ูุณ ุงู„ูƒู„ุงุณุŒ ูˆููŠ ุฃูŠ Inherited Classes (ูƒู„ุงุณุงุช ุจุชูˆุฑุซ ู…ู†ู‡)ุŒ ุญุชู‰ ู„ูˆ ุงู„ูƒู„ุงุณ ุงู„ู„ูŠ ุจูŠูˆุฑุซ ุฏู‡ ู…ูˆุฌูˆุฏ ููŠ Assembly ู…ุฎุชู„ู.
  • ุงู„ุนู„ุงู…ุฉ ููŠ ุงู„ู€ IDE: ุจูŠุจู‚ู‰ ุนู„ูŠู‡ ุดูƒู„ ู†ุฌู…ุฉ.
  • ุงู„ุงุณุชุฎุฏุงู…: ุจู†ุณุชุฎุฏู…ู‡ ุจุดูƒู„ ุฃุณุงุณูŠ ู…ุน ุงู„ู€ Inheritance ุนุดุงู† ู†ุณู…ุญ ู„ู„ูƒู„ุงุณุงุช ุงู„ุฃุจู†ุงุก ุฅู†ู‡ุง ุชูˆุตู„ ู„ุฃุนุถุงุก ู…ุนูŠู†ุฉ ููŠ ุงู„ูƒู„ุงุณ ุงู„ุฃุจ ู…ู† ุบูŠุฑ ู…ุง ู†ุฎู„ูŠู‡ุง public ู„ู„ูƒู„.
  • ู…ู„ุงุญุธุงุช:
    • ู…ูŠู†ูุนุด ู†ุณุชุฎุฏู…ู‡ ููŠ Struct ู„ุฃู†ู‡ ู…ุด ุจูŠุฏุนู… ุงู„ูˆุฑุงุซุฉ.
    • ุจุงู„ู†ุณุจุฉ ู„ู„ูƒู„ุงุณ ุงู„ู„ูŠ ู‡ูˆ ููŠู‡ุŒ ู‡ูˆ ุจูŠุชุนุงู…ู„ ู…ุนุงู…ู„ุฉ ุงู„ู€ private.
  • ู…ุซุงู„:
public class MyClass
{
	protected int myVar = 5;
}
 
// DerivedClass can access myVar because it inherits from MyClass
public class DerivedClass : MyClass
{
	public void ShowVar()
	{
		Console.WriteLine(myVar);
	}
}
 
public class AnotherClass
{
	public void TryAccess()
	{
		MyClass obj = new MyClass();
		// obj.myVar = 10; // ERROR: Not accessible from a non-derived class
	}
}

4. Internal

  • ุงู„ุดุฑุญ: ู†ู‚ุฏุฑ ู†ูˆุตู„ู‡ ุฌูˆุง ู†ูุณ ุงู„ู€ project/assembly. ุงู„ู€ Assembly ู‡ูˆ ุงู„ู…ู†ุชุฌ ุงู„ู†ู‡ุงุฆูŠ ู„ุนู…ู„ูŠุฉ ุงู„ู€ build (ุฒูŠ ู…ู„ู DLL ุฃูˆ EXE). ุฃูŠ ูƒู„ุงุณ ุฌูˆู‡ ู†ูุณ ุงู„ู…ุดุฑูˆุน ูŠู‚ุฏุฑ ูŠุดูˆูู‡ุŒ ู„ูƒู† ู„ูˆ ุญุงูˆู„ุช ุชุณุชุฎุฏู…ู‡ ู…ู† ู…ุดุฑูˆุน ุชุงู†ูŠุŒ ู…ุด ู‡ุชู‚ุฏุฑ.
  • ุงู„ุนู„ุงู…ุฉ ููŠ ุงู„ู€ IDE: ุจูŠุจู‚ู‰ ุนู„ูŠู‡ ุนู„ุงู…ุฉ ู‚ู„ุจ.
  • ู…ุซุงู„:
// This class is in ProjectA.dll
internal class MyClass
{
	internal int myVar = 5;
}
 
// This class is also in ProjectA.dll
class ProgramInSameAssembly
{
	static void Main()
	{
		MyClass obj = new MyClass();
		// Works because it's in the same assembly
		Console.WriteLine(obj.myVar); 
	}
}
// If you try to access MyClass from ProjectB.exe, it will fail.

5. Protected Internal

  • ุงู„ุดุฑุญ: ุฏู‡ ู…ุฒูŠุฌ ุจูŠุฌู…ุน ุจูŠู† Protected ูˆ Internal. ุงู„ูˆุตูˆู„ ุจูŠูƒูˆู† ู…ุณู…ูˆุญ ุจู‡ ููŠ ุญุงู„ุชูŠู† (OR):
    • ู…ู† ุฃูŠ ูƒู„ุงุณ ุฏุงุฎู„ ู†ูุณ ุงู„ู€ Assembly.
    • ุฃูˆ ู…ู† ุฃูŠ Inherited ClassุŒ ุญุชู‰ ู„ูˆ ูƒุงู† ููŠ assembly ู…ุฎุชู„ู.
  • ุจุงู„ู†ุณุจุฉ ู„ู„ูƒู„ุงุณ ุงู„ู„ูŠ ู‡ูˆ ููŠู‡: ุจูŠุชุนุงู…ู„ ู…ุนุงู…ู„ุฉ ุงู„ู€ private.
  • ู…ุซุงู„:
public class MyClass
{
	protected internal int myVar = 5;
}
 
// Derived class in another assembly
public class DerivedClass : MyClass
{
	public void ShowVar()
	{
		// Accessible: it's a derived class
		Console.WriteLine(myVar); 
	}
}
 
// Non-derived class in the same assembly
public class AnotherClassInSameAssembly
{
	public void AccessVar()
	{
		MyClass obj = new MyClass();
		// Accessible: it's in the same assembly
		obj.myVar = 10;
	}
}

6. Private Protected

  • ุงู„ุดุฑุญ: ุฏู‡ ู…ุฒูŠุฌ ู…ู‚ูŠุฏ ุฃูƒุชุฑุŒ ุจูŠุฌู…ุน ุจูŠู† Private ูˆ Protected. ุงู„ูˆุตูˆู„ ู…ุณู…ูˆุญ ุจู‡ ุจุณ ู„ูˆ ุงู„ุดุฑุทูŠู† ุฏูˆู„ ุงุชุญู‚ู‚ูˆุง ู…ุน ุจุนุถ (AND):
    • ู…ู† Inherited Class.
    • ูˆ ู„ุงุฒู… ุงู„ูƒู„ุงุณ ุฏู‡ ูŠูƒูˆู† ููŠ ู†ูุณ ุงู„ู€ Assembly.
  • ุจุงู„ู†ุณุจุฉ ู„ู„ูƒู„ุงุณ ุงู„ู„ูŠ ู‡ูˆ ููŠู‡: ุจูŠุชุนุงู…ู„ ู…ุนุงู…ู„ุฉ ุงู„ู€ internal.
  • ู…ุซุงู„:
// In ProjectA.dll
public class MyClass
{
	private protected int myVar = 5;
}
 
// In ProjectA.dll
public class DerivedClass : MyClass
{
	public void ShowVar()
	{
		// Accessible: derived class AND in the same assembly
		Console.WriteLine(myVar); 
	}
}
 
// In ProjectB.exe
public class DerivedInAnotherAssembly : MyClass
{
	public void TryShowVar()
	{
		// Console.WriteLine(myVar); // ERROR: Not in the same assembly
	}
}

7. New in Modern .NET: The file Modifier

ุงุจุชุฏุงุกู‹ ู…ู† C# 11 (ูˆุงู„ู„ูŠ ู…ูƒู…ู„ ู…ุนุงู†ุง ููŠ .NET 8, 9, ูˆ 10)ุŒ ุธู‡ุฑ Access Modifier ุฌุฏูŠุฏ ูˆู…ู‡ู… ุฌุฏู‹ุง ุงุณู…ู‡ file.

  • ุงู„ู€ file modifier: ุจูŠุฎู„ูŠ ุงู„ูƒู„ุงุณ ู…ุชุดุงู ูู‚ุท ุฌูˆู‡ ู…ู„ู ุงู„ูƒูˆุฏ (ุงู„ู€ .cs file) ุงู„ู„ูŠ ู‡ูˆ ู…ูƒุชูˆุจ ููŠู‡.
  • ุฏู‡ ู…ููŠุฏ ุฌุฏู‹ุง ููŠ ุญุงู„ุงุช ุงู„ู€ Source Generators ุนุดุงู† ูŠู…ู†ุน ุชุนุงุฑุถ ุงู„ุฃุณู…ุงุก ุจูŠู† ุงู„ู…ู„ูุงุช ุงู„ู…ุฎุชู„ูุฉ.
// File-scoped type (C# 11+)
file class HiddenHelpers
{
    // This class is ONLY visible within this specific .cs file
}

ู…ุด ู…ู‡ู….

Summary of Access Levels

ุงู„ุฌุฏูˆู„ ุฏู‡ ุจูŠู„ุฎุต ุฅู…ูƒุงู†ูŠุฉ ุงู„ูˆุตูˆู„ ู„ูƒู„ modifier ู…ู† ุฃู…ุงูƒู† ู…ุฎุชู„ูุฉ:

Access ModifierInside ClassIn Same NamespaceInherited ClassesAnother Class
PublicYesYesYesYes
PrivateYesNoNoNo
ProtectedYesNoYesNo
InternalYesYesNoNo
Protected InternalYesYesYesNo
Private ProtectedYesNoYes (in same Library)No

Access Modifiers in Different Scopes

ุงู„ู‚ูˆุงุนุฏ ุจุชุฎุชู„ู ุนู„ู‰ ุญุณุจ ุงู„ู…ูƒุงู† ุงู„ู„ูŠ ุจุชูƒุชุจ ููŠู‡ ุงู„ูƒูˆุฏ.

Inside a Namespace

ุฌูˆู‡ ุงู„ู€ NamespaceุŒ ุงู„ู€ types ุงู„ู„ูŠ ุจู†ุนุฑูู‡ุง (Class, Struct, Interface, Enum) ู…ุนู†ุฏู‡ุงุด ุบูŠุฑ ุงุชู†ูŠู† Access Modifiers ู…ุชุงุญูŠู†:

  1. ุงู„ู€ Internal (Default): ู„ูˆ ู…ูƒุชุจุชุด ุฃูŠ ุญุงุฌุฉุŒ ุงู„ู€ type ุจุชุงุนูƒ ู‡ูŠูƒูˆู† internal. ุฏู‡ ู…ุนู†ุงู‡ ุฅู†ู‡ ู‡ูŠูƒูˆู† ู…ุชุดุงู ุฌูˆู‡ ุงู„ู€ Library (ุงู„ู…ุดุฑูˆุน) ุงู„ู„ูŠ ู‡ูˆ ููŠู‡ ุจุณ. ู„ูˆ ุญุงูˆู„ุช ุชุณุชุฎุฏู…ู‡ ู…ู† ู…ุดุฑูˆุน ุชุงู†ูŠุŒ ู…ุด ู‡ุชุดูˆูู‡ ูˆู‡ูŠุทู„ุนู„ูƒ error.
  2. ุงู„ู€ Public: ู„ูˆ ุนุงูŠุฒ ุงู„ู€ type ุจุชุงุนูƒ ูŠูƒูˆู† ู…ุชุงุญ ู„ู„ุงุณุชุฎุฏุงู… ููŠ ุฃูŠ ู…ุดุฑูˆุน ุชุงู†ูŠุŒ ู„ุงุฒู… ุชุนู…ู„ู‡ public.

ู‚ุจู„ ู…ุง ุชุญุงูˆู„ ุชุณุชุฎุฏู… ุฃูŠ class ุฃูˆ ุญุงุฌุฉ ู…ูˆุฌูˆุฏุฉ ููŠ Library ุชุงู†ูŠุฉุŒ ู„ุงุฒู… ุงู„ุฃูˆู„ ุชุถูŠู reference ู„ู„ู€ Library ุฏูŠ ููŠ ุงู„ู…ุดุฑูˆุน ุจุชุงุนูƒ (Right click at project โ†’ Build dependencies โ†’ Project dependencies โ†’ Add project reference)ุŒ ูˆุจุนุฏูŠู† ุชุนู…ู„ using ู„ู„ู€ namespace ุจุชุงุนู‡ุง ููˆู‚ ููŠ ู…ู„ู ุงู„ูƒูˆุฏ.

Inside a Class or a Struct

ุฌูˆู‡ ุงู„ู€ Class ุฃูˆ ุงู„ู€ StructุŒ ุจู†ู‚ุฏุฑ ู†ูƒุชุจ members ุฒูŠ ุงู„ู€ Fields, Properties, Methods, ูˆ Events.

  • ุฌูˆู‡ ุงู„ู€ Class: ู…ุชุงุญ ูƒู„ ุงู„ุณุชุฉ Access Modifiers.
  • ุฌูˆู‡ ุงู„ู€ Struct: ู…ุชุงุญ ุชู„ุงุชุฉ ุจุณ: PrivateุŒ InternalุŒ ูˆ Public.

ุงู„ุงูุชุฑุงุถูŠ (Default) ููŠ ุงู„ุงุชู†ูŠู† ู‡ูˆ Private.

Inside an Interface

ุฌูˆู‡ ุงู„ู€ InterfaceุŒ ุจู†ู‚ุฏุฑ ู†ูƒุชุจ:

  • ุงู„ู€ Signature for a Property: ุจู†ุญุฏุฏ ุดูƒู„ ุงู„ู€ property ุจุณุŒ ุฒูŠ: public int Salary {get; set;}.
  • ุงู„ู€ Signature for a Method: ุจู†ูƒุชุจ ุชูˆู‚ูŠุน ุงู„ู€ method ู…ู† ุบูŠุฑ bodyุŒ ุฒูŠ: public void MyFun();.
  • ุงู„ู€ Default Implemented Method: function ูƒุงู…ู„ุฉ ุจุงู„ู€ body ุจุชุงุนู‡ุง (ู…ูŠุฒุฉ ุงุชุถุงูุช ููŠ C# 8.0).

ุงู„ุงูุชุฑุงุถูŠ (Default) ููŠ ุงู„ู€ Interface ู‡ูˆ Public. ูˆุงู„ุณุจุจ ู‡ูˆ ุฅู† ุงู„ู€ Interface ุนุจุงุฑุฉ ุนู† contractุŒ ูู„ุงุฒู… ูƒู„ ุญุงุฌุฉ ููŠู‡ ุชูƒูˆู† ู…ุชุงุญุฉ ู„ู„ูƒู„ุงุณ ุงู„ู„ูŠ ู‡ูŠุนู…ู„ู‡ implement.

Inside an Enum

ุฌูˆู‡ ุงู„ู€ EnumุŒ ุจู†ูƒุชุจ Labels (ุฃุณู…ุงุก ุงู„ู‚ูŠู…)ุŒ ูˆุฏูŠ ุจุชูƒูˆู† public ุจุดูƒู„ ุงูุชุฑุงุถูŠ.

Summary Table for Scopes & Defaults

ScopeWhatโ€™s Inside?Valid Access ModifiersDefault
NamespaceClass, Struct, Interface, EnumInternal, PublicInternal
ClassFields, Properties, Methods, EventsAll 6 ModifiersPrivate
StructFields, Properties, Methods, EventsPrivate, Internal, PublicPrivate
InterfaceProperty/Method Signatures, Default Methods-Public

Practical Example Breakdown

ุงู„ู…ุซุงู„ ุฏู‡ ุจูŠูˆุถุญ ุงู„ูุฑู‚ ุงู„ุฏู‚ูŠู‚ ุจูŠู† private protected ูˆ protected internal ููŠ ุณูŠู†ุงุฑูŠูˆู‡ุงุช ู…ุฎุชู„ูุฉ:

// Library: Common
public class TypeA
{
	private protected int X;
	protected int Y; 
	protected internal int Z;
}
 
// === Scenario 1: Derived Class in the SAME Library ===
// Class: TypeB
internal class TypeB : TypeA
{
    public TypeB()
    {
        // X is accessible: derived AND in same assembly.
        this.X = 1;
 
        // Y is accessible: derived.
        this.Y = 2;
 
        // Z is accessible: in same assembly.
        this.Z = 3;
    }
}
 
// === Scenario 2: Derived Class in ANOTHER Library ===
// Class: TypeC (in a different project/assembly)
internal class TypeC : TypeA
{
	public TypeC()
	{
		// X is NOT accessible: it's a derived class, BUT NOT in the same assembly.
		// this.X = 1; // ERROR
 
		// Y is accessible: it's a derived class.
		this.Y = 2;
 
		// Z is accessible: it's a derived class.
		this.Z = 3;
	}
}