Модификаторы доступа в 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), которые распространяются среди других компаний.
Это отличный способ «защитить» ваши классы, методы и свойства от неправильного использования другими. Но если вы не будете осторожны, вы можете столкнуться с собственными проблемами.
Какие модификаторы доступа вы используете чаще всего?
Понравилась эта статья? Пожалуйста, не забудьте похлопать в ответ. Хотите следовать за мной для большего? Нажмите кнопку «Подписаться»!