Introducere în modificatorii de acces în C #

Acest articol acoperă cel mai elementar concept al programării orientate pe obiecte din perspectiva limbajului de programare C #. Conceptul este cunoscut sub numele de - Modificatori de acces. Prima întrebare la care să răspunde este - Ce sunt modificatorii de acces? Mai simplu spus, modificatorii de acces controlează ce obiecte / variabile / constante / metode (practic totul) pot fi accesate în care parte a codului. Modificatorii de acces joacă un rol important în dovedirea conceptului de abstractizare în programarea orientată pe obiecte. Ei controlează ce parte a programului ar trebui să fie și nu ar trebui să fie vizibili pentru utilizatorul final. Desigur, un utilizator final este cel mai puțin preocupat de constantele și variabilele implicate în algoritm. El este preocupat doar de ce metodă trebuie să invoce pentru a obține rezultatul.

Tipuri de modificatori de acces în C #

C # ne oferă patru tipuri de modificatori de acces:

  • Privat (modificatorul implicit de acces, cu excepția enumerurilor și a interfețelor)
  • Protejat (ușor restricționat)
  • Public (fără restricții, alegerea implicită pentru enumere și interfețe)
  • Intern (public în cadrul aceleiași adunări)

În afară de aceste patru modificatoare de acces, există alte două combinații de niveluri de acces -

  • Protect intern
  • Privat protejat

Să ne înțelegem fiecare cu un exemplu.

1. Privat

Privat este cel mai restricționat nivel de acces. De asemenea, este modificatorul de acces implicit pentru toate constantele, variabilele, obiectele definite de utilizator, etc. Numai enumerele și interfețele sunt publice în mod implicit. Deci, dacă nu specificați niciun modificator de acces, C # îi atribuie modificatorul implicit.

Obiectele private nu sunt accesibile în afara corpului clasei sau structurilor sau secțiunii de programe în care sunt declarate. Orice încercare de a accesa obiectul în afara domeniului de aplicare al corpului în care este declarat are ca rezultat o eroare de compilare.

Exemplul # 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);
)
)

Rezultat 1:

Exemplul # 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);
)
)

Rezultat 2:

2. Protejat

Specificatorul de acces protejat restricționează un obiect accesibil numai din instanțele derivate ale clasei. Deci, dacă un obiect din clasa copil încearcă să acceseze obiectele protejate ale unei clase părinte, este permis. Clasele care nu derivă nu pot accesa membrii protejați ai niciunei clase. Desigur, obiectele protejate sunt accesibile metodelor din propria clasă.

Exemplu

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);
)
)

Rezultat 3:

3. Public

Acesta este modificatorul de acces cel mai puțin restricționat. Obiectele publice sunt practic accesibile întregii lumi exterioare, ceea ce îl face cel mai înalt modificator de acces permis. Desigur, acest lucru are un cost mare - costul celei mai mici protecții.

Membrii publici pot fi accesați prin orice parte a codului. Acest lucru le face cel mai puțin sigure. Orice logică de cod își poate modifica valoarea care poate duce la un comportament neașteptat. Deci, trebuie să fim foarte precauți înainte de a face public orice obiect.

În aceeași clasă de angajați pe care am creat-o în exemplul nostru de modificator de acces privat, dacă schimbăm nivelul de acces la public nu am avea nevoie de metode Getter și Setter. De fapt, cea mai bună practică este de a face obiectul privat și de a utiliza proprietățile C # Getter și Setter.

Exemplu

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);
)
)

Rezultat 4:

4. Intern

Obiectele și metodele interne sunt accesibile numai în cadrul aceluiași ansamblu. Acesta este un modificator de acces foarte util atunci când doriți să faceți public orice obiect și totuși doriți să restricționați accesul acestuia doar la cadrul pe care îl codificați.

Deci, în esență, toate obiectele interne sunt accesibile de toate zonele aceluiași ansamblu.

Să creăm două aplicații de consolă pentru a înțelege acest lucru.

Exemplu

Pasul 1: Creați o aplicație de consolă C # și introduceți codul de mai jos în ea:

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);
)
)
)

Pasul 2: Construiți soluția pentru a obține fișierul .dll din folderul bin.

Pasul 3: Creați o altă aplicație de consolă și trimiteți fișierul de asamblare din ConsoleApp1. Faceți clic pe Adăugare referință în imaginea de mai jos și răsfoiți la locația fișierului .dll de la pasul 2. Acesta trebuie să fie similar cu ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

După adăugarea fișierului .dll, ar trebui să îl găsiți în Ansambluri.

Pasul 4: Plasați codul de mai jos în 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);
)
)
)

Pasul 5: Când construiți ConsoleApp2, veți primi o eroare de compilare care indică faptul că „x” de la ConsoleApp1 nu poate fi accesat în alte ansambluri din cauza nivelului său de protecție.

5. Intern protejat

Aceasta este o combinație a modificatorilor de acces protejat și intern. Un concept important de înțeles aici este faptul că Protecția internă înseamnă protejat SAU intern. Este o uniune a ambelor modificatoare de acces. Nu trebuie niciodată gândit a fi o intersecție.

Deci, obiectele interne nu sunt accesibile în afara ansamblului, în timp ce obiectele protejate sunt accesibile oricărei clase derivate din orice ansamblu. Ce se întâmplă dacă vreau să-mi protejez obiectul doar în alte ansambluri și nu în același ansamblu? Soluție simplă - declarați-o ca fiind protejat intern.

Exemplu

Pasul 1: Să modificăm ConsoleApp1 pentru a reflecta codul de mai jos. Observați că am schimbat nivelul de acces al variabilei noastre „x” în interior protejat.

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);
)
)
)

Pasul 2: Construiți din nou soluția și înlocuiți .dll în ConsoleApp2 cu una actualizată.

Pasul 3: Actualizați codul în ConsoleApp2 după cum urmează:

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();
)
)
)

Pasul 4: Rulați ConsoleApp2 pentru a vedea ieșirea.

6. Privat protejat

Aceasta este o combinație de uniune atât a modificatorilor de acces privat cât și a celor protejați. Protect intern înseamnă protejat sau intern protejat. Deci, obiectele private nu sunt accesibile în afara blocului de cod în care este declarat, în timp ce obiectele protejate sunt accesibile oricărei clase derivate dintr-un ansamblu. Ce se întâmplă dacă vreau să restricționez accesul obiectului meu chiar și în clase derivate din alte ansambluri? Soluție simplă - declarați-o ca fiind protejat intern.

Exemplu

Să modificăm nivelul de acces „x” din ConsoleApp1 la 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();
)
)
)

ieşire:

Comparație tabulară

Acces Specificator Aceeași Adunare Altă adunare
Aceeasi clasaClasa derivatăClasa non derivatăClasa derivatăClasa non derivată
PrivatdaNuNuNuNu
Publicdadadadada
ProtejatdadaNudaNu
InterndadadaNuNu
Protect interndadadadaNu
Privat protejatdadaNuNuNu

Concluzie

Am văzut în articolul de mai sus că modificatorii de acces controlează accesul la tot ceea ce se află în proiect. Diferite combinații de niveluri de acces acoperă nevoile diferitelor tipuri de accesibilitate. Dezvoltatorii trebuie să aleagă cu înțelepciune, ținând cont de securitatea și necesitatea absolută a obiectului de a fi accesibil într-un anumit bloc de cod.

Articole recomandate

Acesta este un ghid pentru modificatorii de acces din C #. Aici am discutat despre tipurile de introducere a modificatorilor de acces în C # împreună cu exemple și rezultate. Puteți parcurge și alte articole sugerate pentru a afla mai multe -

  1. Compilatoare C #
  2. Distrugător în C #
  3. Ce este TypeScript?
  4. Ce este ASP.Net Web Services?
  5. Modificatori de acces în PHP
  6. Funcționare și Top 3 Metode Enum în C #