Модификаторы доступа в C# используются для определения доступа к определенному классу, методу, свойству и т. д. В этом руководстве объясняется, как их использовать с примерами.

Объяснение модификаторов доступа

Вкратце: они определяют доступность типов и членов типов. Таким образом, вы можете «скрыть» классы для людей, которые используют ваш код, или явно показать свойства определенного класса.

В C# существует 6 различных модификаторов доступа, а именно:

Примеры

Приватные и публичные модификаторы доступа

MovieService movieService = new();
movieService.SetTitle("The Matrix");

class MovieService
{
    private int id;      
    public string title;  

    public void SetTitle(string title)
    {
        this.title = MakeUrlFriendly(title);
    }

    private string MakeUrlFriendly(string title)
    {
        return title
            .ToLower()
            .Replace(" ", string.Empty)
            .Replace("#", string.Empty)
            .Trim();
    }
}

В этом коде вы можете увидеть частный идентификатор типа int. К этому свойству не может получить доступ служба movieService, инициализированная в первой строке. То же самое касается метода MakeUrlFriendly(). Но их можно использовать внутри класса MovieService, как показано в методах.

Метод SetTitle() и свойство title являются общедоступными и могут использоваться вне класса, как показано в первых двух строках кода в примере.

Public и private — наиболее часто используемые модификаторы доступа в C#.

Модификатор защищенного доступа

Protected защищает тип или член для непосредственного использования, но может использоваться производным классом.

MovieService movieService = new();
//Console.WriteLine(movieService.title); // This won't work, because it's protected
Console.WriteLine(movieService.TheTitle);

class MovieService : TheMatrix
{
    public string TheTitle => title;
}

class TheMatrix
{
    protected string title = "The Matrix";
}

Вторая строка пытается получить заголовок из класса TheMatrix. Но это не работает. Однако в классе MovieService заголовок можно получить, поскольку MovieService является производным от класса TheMatrix.

Вы также можете создавать защищенные методы:

MovieService movieService = new();
//Console.WriteLine(movieService.MakeUrlFriendly); // This won't work, because it's protected
Console.WriteLine(movieService.UrlFriendlyTitle);

class MovieService : TheMatrix
{
    public string TheTitle => title;
    public string UrlFriendlyTitle => MakeUrlFriendly();
}

class TheMatrix
{
    public string title = "The Matrix";

    protected string MakeUrlFriendly()
    {
        return this.title
            .ToLower()
            .Replace("#", string.Empty)
            .Replace("?", string.Empty)
            .Trim();
    }
}

Внутренний модификатор доступа

Это не может быть показано в одном блоке кода. По той простой причине, что вам нужна другая сборка, а это совершенно новый проект.

Сначала посмотрите на код ниже:

Movie movie = new()
{
    Title = "The Muppets",
    Rating = 10,
};

movie.GetDetails();

class Movie
{
    internal string Title;
    internal int Rating;

    internal void GetDetails()
    {
        Console.WriteLine($"The Title of the movie is {Title}, which has a rating of {Rating}");
    }
}

Если вы скопируете это в новое консольное приложение, оно будет работать без проблем.

Теперь давайте немного изменим его. Давайте создадим совершенно новый проект, библиотеку классов, и поместим класс Movie в этот новый проект. Не забудьте сделать класс общедоступным!

public class Movie
{
    internal string Title;
    internal int Rating;

    internal void GetDetails()
    {
        Console.WriteLine($"The Title of the movie is {Title}, which has a rating of {Rating}");
    }
}

Сделайте ссылку из новой библиотеки классов на консольное приложение и добавьте использование для Movie.

using ATotallyDifferentProject;

Movie movie = new()
{
    Title = "The Muppets",
    Rating = 10,
};

movie.GetDetails();

Это должно привести к ошибкам из-за уровней защиты.

Как вы заметили, Title и Rating можно использовать в классе Movie, но не в инициализированном члене консольного приложения.

Внутренний модификатор защищенного доступа

Возьмем предыдущий пример кода, но немного его изменим:

public class Movie
{
    public string Title;
    internal int Rating;

    internal protected string GetTitle => Title;

    internal void GetDetails()
    {
        Console.WriteLine($"The Title of the movie is {Title}, which has a rating of {Rating}");
    }
}

Я сделал Title общедоступным и добавил свойство GetTitle, которое имеет внутреннюю защиту. Теперь вернемся к консольному приложению:

using ATotallyDifferentProject;

SecondClass movie = new()
{
    Title = "The Muppets",
};

// Console.WriteLine(movie.GetTitle); // Doesn't work.
Console.WriteLine(movie.TheOriginalTitle);

class SecondClass : Movie
{
    public string TheOriginalTitle => GetTitle;
}

Как видите, я установил название фильма. Затем я попытался получить заголовок с помощью movie.GetTitle, не работает, потому что он защищен. Поэтому я создал свойство в классе SecondClass, TheOriginalTitle, которое имеет доступ к GetTitle класса Movie.

Частный модификатор защищенного доступа

Private protected работает только тогда, когда класс является производным или внутри самого класса. Взгляните на пример кода ниже, чтобы узнать, как это работает:

SecondClass movie = new()
{
    Title = "The Muppets",
};

//Console.WriteLine(movie.Rating); // Doesn't work.
Console.WriteLine(movie.GetTheRating);

class SecondClass : Movie
{
    public int GetTheRating => Rating; 
}

public class Movie
{
    public string Title;
    private protected int Rating = 5;

    internal protected string GetTitle => Title;

    internal void GetDetails()
    {
        Console.WriteLine($"The Title of the movie is {Title}, which has a rating of {Rating}");
    }
}

Заключение

Хотя большинство разработчиков используют private и public, я призываю вас обратить внимание и на другие модификаторы доступа. Особенно, когда вы создаете библиотеки (DLL), которые распространяются среди других компаний.

Это отличный способ «защитить» ваши классы, методы и свойства от неправильного использования другими. Но если вы не будете осторожны, вы можете столкнуться с собственными проблемами.

Какие модификаторы доступа вы используете чаще всего?

Понравилась эта статья? Пожалуйста, не забудьте похлопать в ответ. Хотите следовать за мной для большего? Нажмите кнопку «Подписаться»!