Modifikátory přístupu (access modifiers) jsou klíčovým nástrojem zapouzdření v objektově orientovaném programování. Řídí viditelnost tříd, metod a členských proměnných.

Úrovně

V C# existují čtyři hlavní úrovně přístupu:

  1. public
  2. internal
  3. protected
  4. private

Navíc existují i jejich kombinace (protected internal a private protected), které ale nejsou hojně využívány.

Public

Přístup ke členům je možný odkudkoliv v rámci Solution. Používá se, pokud je potřeba, aby se typ nebo člen stal veřejnou součástí API.

Internal

Přístup k členům je možný odkudkoliv v rámci Projektu. Používá se pro kód, který není vhodné vystavit pro veřejné použití, ale který potřebuje být sdílen uvnitř projektu.

Protected

Přístup k členům je možný odkudkoliv v rámci třídy a jejich potomků. Používá se, pokud je potřeba dovolit přepisování (override) nebo práci s členy ve třídách, které odvozují od základní třídy, ale zároveň skrýt detaily před ostatními.

Private

Jedná se o nejpřísnější úroveň zapouzdření, která členy třídy zpřístupní jen v rámci třídy. Používá se pro vnitřní implementační detaily třídy.

Správná volba modifikátoru přístupu

Modifikátor přístupu je vhodné volit co nejpřísněji (tzn. ideálně vše by mělo začínat na úrovni private) a postupně dle požadvků zvolňovat až na public.

Ukázka

public class Person
{
    // Public property - dostupná odkudkoliv
    public string FirstName { get; set; }
 
    // Internal property - dostupná jen uvnitř stejného sestavení (projektu)
    internal string MiddleName { get; set; }
 
    // Protected property - dostupná jen v této třídě a potomcích
    protected string LastName { get; set; }
 
    // Private proměnná
    private int age;
 
    public Person(string firstName, string middleName, string lastName, int age)
    {
        FirstName = firstName;
        MiddleName = middleName;
        LastName = lastName;
        this.age = age;
    }
 
    // Veřejná metoda, která využívá private člen
    public void DisplayAge()
    {
        Console.WriteLine($"Age: {age}");
    }
}
 
public class Employee : Person
{
    public string JobTitle { get; set; }
 
    public Employee(string firstName, string middleName, string lastName, int age, string jobTitle)
        : base(firstName, middleName, lastName, age)
    {
        JobTitle = jobTitle;
    }
 
    public void DisplayInfo()
    {
        Console.WriteLine($"FirstName (public): {FirstName}");       // OK
        Console.WriteLine($"MiddleName (internal): {MiddleName}");   // OK (pokud jsme ve stejném projektu)
        Console.WriteLine($"LastName (protected): {LastName}");     // OK
        // Console.WriteLine(age);                                  // CHYBA: private
        Console.WriteLine($"JobTitle (public): {JobTitle}");
    }
}
 

Modifikátory pro třídy

Třída by měla být buďto public nebo internal. Pokud je vnořená do jiné třídy, tak pak může být i private nebo protected.