Введение в модификаторы доступа в C #

В этой статье рассматривается наиболее элементарная концепция объектно-ориентированного программирования с точки зрения языка программирования C #. Концепция известна как - Модификаторы доступа. Самый первый вопрос, который нужно ответить, - что такое модификаторы доступа? Проще говоря, модификаторы доступа управляют тем, какие объекты / переменные / константы / методы (практически все) могут быть доступны в какой части кода. Модификаторы доступа играют важную роль в проверке концепции абстракции в объектно-ориентированном программировании. Они контролируют, какая часть программы должна быть и не должна быть видна конечному пользователю. Конечно, конечного пользователя меньше всего волнуют константы и переменные, задействованные в алгоритме. Он обеспокоен только тем, какой метод ему нужно вызвать, чтобы получить результат.

Типы модификаторов доступа в C #

C # предоставляет нам четыре типа модификаторов доступа:

  • Private (модификатор доступа по умолчанию, кроме перечислений и интерфейсов)
  • Защищено (слегка ограничено)
  • Общедоступный (неограниченный, выбор по умолчанию для перечислений и интерфейсов)
  • Внутренний (общедоступный в рамках одной сборки)

Помимо этих четырех модификаторов доступа, есть еще две комбинации уровней доступа:

  • Защищенный Внутренний
  • Частная защита

Давайте разберемся с каждым примером.

1. Частный

Частный является наиболее ограниченным уровнем доступа. Это также модификатор доступа по умолчанию для всех констант, переменных, пользовательских объектов и т. Д. Только перечисления и интерфейсы являются общедоступными по умолчанию. Таким образом, если вы не укажете какой-либо модификатор доступа, C # назначит ему модификатор по умолчанию.

Закрытые объекты не доступны вне тела класса, структуры или раздела программы, в которых они объявлены. Любая попытка доступа к объекту вне области тела, в котором он объявлен, приводит к ошибке времени компиляции.

Пример № 1

using System;
class Employee //private by default
(
string name; //private by default
public string GetName()
(
return name;
)
public void SetName(string name)
(
this.name = name;
)
)
public class Program
(
public static void Main()
(
Employee emp = new Employee();
emp.SetName("John");
Console.Write("Employee name is " + emp.GetName());
// compile time error - 'Employee.name' is inaccessible due to its protection level
// Console.Write("Employee name is " + emp.name);
)
)

Выход 1:

Пример № 2

using System;
public class Program
(
public static void Main()
(
int x = 5; //private to the Main method, accessible inside nested code blocks in the Main method
if (true)
(
int y = 10; //private to the if block, not accessible outside if block
Console.WriteLine("x = " + x);
Console.WriteLine("y = " + y);
)
Console.WriteLine("x = " + x);
// compile-time error - The name 'y' does not exist in the current context.
// Console.WriteLine("y = " + y);
)
)

Выход 2:

2. Защищено

Спецификатор защищенного доступа ограничивает доступ к объекту только из производных экземпляров класса. Таким образом, если объект дочернего класса пытается получить доступ к защищенным объектам родительского класса, это разрешается. Не производные классы не могут получить доступ к защищенным членам любого класса. Конечно, защищенные объекты доступны для методов своего класса.

пример

using System;
class Parent
(
protected string x;
public Parent()
(
x = "abc"; //accessible to own class methods
)
)
class Child : Parent // derived class
(
public static void Main()
(
var parentObj = new Parent();
var childObj = new Child();
Console.WriteLine(childObj.x); //accessible to derived class object instances
// compile-time error - Cannot access protected member 'Parent.x' via a qualifier of type 'Parent'; the qualifier must be of type 'Child' (or derived from it)
// Console.WriteLine(parentObj.x);
)
)

Выход 3:

3. Публичная

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

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

В том же классе Employee, который мы создали в нашем примере модификатора частного доступа, если мы изменим уровень доступа на общедоступный, нам не понадобятся никакие методы Getter и Setter. На самом деле, лучшая практика - сделать объект приватным и использовать свойства C # Getter и Setter.

пример

using System;
class Employee
(
public string name;
)
public class Program
(
public static void Main()
(
Employee emp = new Employee();
emp.name = "John";
Console.Write("Employee name is " + emp.name);
)
)

Выход 4:

4. Внутренний

Внутренние объекты и методы доступны только в одной сборке. Это очень полезный модификатор доступа, когда вы хотите сделать любой объект общедоступным, но при этом хотите ограничить его доступ только той платформой, которую вы кодируете.

Итак, по сути, все внутренние объекты доступны всем областям одной и той же сборки.

Давайте создадим два консольных приложения, чтобы понять, как это работает.

пример

Шаг 1. Создайте консольное приложение C # и поместите в него приведенный ниже код:

using System;
namespace ConsoleApp1
(
public class Parent
(
internal int x;
public Parent()
(
x = 10;
)
)
public class Program
(
public static void Main()
(
var parentObj = new Parent();
// accessible within the same assembly
Console.Write("The value of x = " + parentObj.x);
)
)
)

Шаг 2: Постройте решение, чтобы получить файл .dll из папки bin.

Шаг 3. Создайте другое консольное приложение и создайте ссылку на файл сборки из ConsoleApp1. Нажмите «Добавить ссылку» на изображении ниже и перейдите к расположению файла DLL на шаге 2. Он должен быть похож на ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

После добавления файла .dll вы должны найти его в разделе «Сборки».

Шаг 4: Поместите приведенный ниже код в ConsoleApp2.

using System;
using ConsoleApp1; //referencing the first assembly
namespace ConsoleApp2
(
class Program
(
static void Main(string() args)
(
var parentObj = new Parent();
//not accessible outside the assembly
Console.Write(parentObj.x);
)
)
)

Шаг 5: Когда вы собираете ConsoleApp2, вы получите ошибку времени компиляции, указывающую, что 'x' из ConsoleApp1 не может быть доступен в других сборках из-за его уровня защиты.

5. Защищенный внутренний

Это комбинация модификаторов защищенного и внутреннего доступа. Здесь важно понять, что Защищенный Внутренний означает Защищенный ИЛИ Внутренний. Это объединение обоих модификаторов доступа. Никогда нельзя думать, что это пересечение.

Таким образом, Внутренние объекты недоступны вне сборки, а Защищенные объекты доступны любому производному классу в любой сборке. Что если я хочу защитить свой объект только в других сборках, а не в той же сборке? Простое решение - объявить его внутренним защищенным.

пример

Шаг 1: Давайте изменим наше ConsoleApp1, чтобы отразить код ниже. Обратите внимание, что мы изменили уровень доступа нашей переменной 'x' к внутреннему защищенному.

using System;
namespace ConsoleApp1
(
public class Parent
(
protected internal int x;
public Parent()
(
x = 10;
)
)
public class Program
(
public static void Main()
(
var parentObj = new Parent();
// accessible within the same assembly
Console.Write("The value of x = " + parentObj.x);
)
)
)

Шаг 2: Снова соберите решение и замените .dll в ConsoleApp2 на обновленную.

Шаг 3. Обновите код в ConsoleApp2, как показано ниже:

using System;
using ConsoleApp1; //referencing the first assembly
namespace ConsoleApp2
(
class Program: Parent
(
static void Main(string() args)
(
var progObj = new Program();
//accessible only via an object of the derived class.
Console.Write(progObj.x);
Console.Read();
)
)
)

Шаг 4: Запустите ConsoleApp2, чтобы увидеть результат.

6. Частная Защищенная

Это объединение модификаторов частного и защищенного доступа. Защищенный Внутренний означает Защищенный ИЛИ Внутренний. Таким образом, частные объекты недоступны за пределами блока кода, в котором они объявлены, а защищенные объекты доступны любому производному классу в любой сборке. Что если я хочу ограничить доступ моего объекта даже в производных классах в других сборках? Простое решение - объявить его внутренним защищенным.

пример

Давайте изменим уровень доступа «x» в ConsoleApp1 на Private Protected.

using System;
namespace ConsoleApp1
(
public class Parent
(
private protected int x;
public Parent()
(
x = 10;
)
)
public class Child: Parent (
public void DisplayX() (
// accessible only via derived class objects
Console.Write("Value of x = " + x);
)
)
public class Program
(
public static void Main()
(
var childObj = new Child();
childObj.DisplayX();
Console.Read();
)
)
)

Выход:

Табличное сравнение

Спецификатор доступа Та же сборка Другое собрание
Тот же классПроизводный классНепроизводный классПроизводный классНепроизводный класс
Частныйданетнетнетнет
общественногодадададада
защищенныйдаданетданет
внутреннийдададанетнет
Защищенный Внутреннийдадададанет
Частная защитададанетнетнет

Вывод

В приведенной выше статье мы видели, что модификаторы доступа контролируют доступ ко всему в проекте. Различные комбинации уровней доступа покрывают потребности различных видов доступности. Разработчики должны выбирать с умом, учитывая безопасность и абсолютную необходимость доступности объекта в определенном блоке кода.

Рекомендуемые статьи

Это руководство по модификаторам доступа в C #. Здесь мы обсудили вводные типы модификаторов доступа в C # вместе с примерами и результатами. Вы также можете просмотреть наши другие предлагаемые статьи, чтобы узнать больше -

  1. Компиляторы C #
  2. Деструктор в C #
  3. Что такое TypeScript?
  4. Что такое веб-службы ASP.Net?
  5. Модификаторы доступа в PHP
  6. Рабочие и лучшие 3 метода перечисления в C #