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

Ця стаття охоплює найелементарнішу концепцію об'єктно-орієнтованого програмування з точки зору мови програмування на C #. Концепція відома як - Модифікатори доступу. Перше запитання, на яке потрібно відповісти, - що таке Модифікатори доступу? Простіше кажучи, модифікатори доступу керують тим, які об’єкти / змінні / константи / методи (практично все) можна отримати в якій частині коду. Модифікатори доступу відіграють важливу роль у підтвердженні концепції абстракції в об'єктно-орієнтованому програмуванні. Вони контролюють, яка частина програми має бути, а не повинна бути видимою для кінцевого споживача. Звичайно, кінцевого споживача найменше турбують постійні та змінні, що беруть участь в алгоритмі. Його хвилює лише те, до якого методу його потрібно застосувати, щоб отримати вихід.

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

C # надає нам чотири типи модифікаторів доступу:

  • Приватний (модифікатор доступу за замовчуванням, крім enums та інтерфейсів)
  • Захищений (злегка обмежений)
  • Загальнодоступний (необмежений, вибір за замовчуванням для переліків та інтерфейсів)
  • Внутрішній (загальнодоступний в межах однієї асамблеї)

Крім цих чотирьох модифікаторів доступу, є ще дві комбінації рівня доступу -

  • Захищений внутрішній
  • Приватний захищений

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

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 на приватний захищений.

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 методи Enum у C #