Úvod do modifikátorov prístupu v jazyku C #

Tento článok sa venuje najzákladnejšiemu konceptu objektovo orientovaného programovania z pohľadu programovacieho jazyka C #. Tento koncept je známy ako - Modifikátory prístupu. Prvá otázka, na ktorú treba odpovedať, je: - Čo sú modifikátory prístupu? Jednoducho povedané, modifikátory prístupu riadia, ku ktorým objektom, premenným / konštantám / metódam (prakticky všetko) sa dá pristupovať v ktorej časti kódu. Modifikátory prístupu zohrávajú dôležitú úlohu pri preukazovaní konceptu abstrakcie v objektovo orientovanom programovaní. Kontrolujú, ktorá časť programu by mala byť a pre koncového používateľa by nemala byť viditeľná. Koncový používateľ sa, samozrejme, najmenej obáva konštánt a premenných zahrnutých v algoritme. Zaujíma sa iba o to, akú metódu musí uplatniť, aby získal výstup.

Typy modifikátorov prístupu v jazyku C #

C # nám poskytuje štyri typy modifikátorov prístupu:

  • Súkromné ​​(predvolený modifikátor prístupu, okrem enumov a rozhraní)
  • Chránené (mierne obmedzené)
  • Verejné (neobmedzené, predvolená voľba pre zoznamy a rozhrania)
  • Interné (verejné v rámci toho istého zhromaždenia)

Okrem týchto štyroch modifikátorov prístupu existujú ešte dve kombinácie úrovne prístupu -

  • Chránené interne
  • Súkromné ​​chránené

Porozumejme každému príkladom.

1. Súkromné

Súkromný je najviac obmedzená úroveň prístupu. Je to tiež predvolený modifikátor prístupu pre všetky konštanty, premenné, objekty definované používateľom atď. Predvolene sú iba zoznamy a rozhrania verejné. Takže, ak nezadáte žiadny modifikátor prístupu, C # mu priradí predvolený modifikátor.

Súkromné ​​objekty nie sú prístupné mimo tela triedy alebo štruktúry alebo programovej sekcie, v ktorej sú deklarované. Akýkoľvek pokus o prístup k objektu mimo rozsahu tela, v ktorom je deklarovaný, má za následok chybu kompilácie.

Príklad č. 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);
)
)

Výstup 1:

Príklad č. 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);
)
)

Výstup 2:

2. Chránené

Špecifikátor chráneného prístupu obmedzuje prístup k objektu iba z odvodených inštancií triedy. Ak sa teda objekt podradenej triedy pokúša získať prístup k chráneným objektom nadradenej triedy, je to povolené. Nederivované triedy nemajú prístup k chráneným členom žiadnej triedy. Chránené objekty sú samozrejme prístupné metódam vlastnej triedy.

príklad

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

Výstup 3:

3. Verejné

Toto je modifikátor prístupu s najmenším obmedzením. Verejné objekty sú prakticky prístupné celému vonkajšiemu svetu, čím sa stávajú najvyšším prípustným modifikátorom prístupu. Toto samozrejme stojí za vysoké náklady - náklady na najmenšiu ochranu.

Prístup k verejným členom je z ktorejkoľvek časti kódu. Vďaka tomu sú najmenej bezpečné. Akákoľvek logika kódu môže zmeniť ich hodnotu, čo môže viesť k neočakávanému správaniu. Pred zverejnením akéhokoľvek objektu musí byť preto veľmi opatrný.

V tej istej triede zamestnancov, ktorú sme vytvorili v našom príklade modifikátora súkromného prístupu, ak zmeníme úroveň prístupu na verejnosť, nepotrebujeme žiadne metódy Getter a Setter. V skutočnosti je najlepšou praxou urobiť objekt súkromným a používať vlastnosti C # Getter a Setter.

príklad

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

Výstup 4:

4. Interné

Interné objekty a metódy sú prístupné iba v rámci tej istej zostavy. Toto je veľmi užitočný modifikátor prístupu, ak chcete zverejniť akýkoľvek objekt a napriek tomu chcete obmedziť jeho prístup iba na rámec, ktorý kódujete.

V podstate sú teda všetky vnútorné objekty prístupné vo všetkých oblastiach tej istej zostavy.

Vytvorme dve konzolové aplikácie, aby sme pochopili túto prácu.

príklad

Krok 1: Vytvorte aplikáciu konzoly C # a do nej vložte nasledujúci kód:

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

Krok 2: Vytvorte riešenie a získajte súbor .dll z priečinka bin.

Krok 3: Vytvorte ďalšiu aplikáciu konzoly a odkazujte na súbor zostavy z ConsoleApp1. Kliknite na Pridať odkaz na obrázku nižšie a prejdite na umiestnenie súboru .dll z kroku 2. Musí to byť podobné ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

Po pridaní súboru .dll by ste ho mali nájsť v časti Zostavy.

Krok 4: Vložte nasledujúci kód do 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);
)
)
)

Krok 5: Pri vytváraní ConsoleApp2 by sa vyskytla chyba pri kompilácii, ktorá naznačuje, že k 'x' z ConsoleApp1 nie je možné pristupovať v iných zostavách z dôvodu jej úrovne ochrany.

5. Chránené interné

Je to kombinácia modifikátorov chráneného aj interného prístupu. Dôležitým konceptom na pochopenie je, že chránené interné znamená chránené alebo interné. Je to spojenie oboch modifikátorov prístupu. Nikdy to nesmie byť považované za priesečník.

Interné objekty nie sú prístupné mimo zostavy, zatiaľ čo chránené objekty sú prístupné pre každú odvodenú triedu v akejkoľvek zostave. Čo ak chcem chrániť svoj objekt iba v iných zostavách a nie v rovnakom zhromaždení? Jednoduché riešenie - deklarujte ho ako interné chránené.

príklad

Krok 1: Upravme náš ConsoleApp1 tak, aby odrážal kód uvedený nižšie. Všimnite si, že sme zmenili úroveň prístupu k našej premennej x na chránenú internú.

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

Krok 2: Zostavte riešenie znova a nahraďte .dll v ConsoleApp2 aktualizovaným.

Krok 3: Aktualizujte kód v aplikácii ConsoleApp2 takto:

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

Krok 4: Spustením aplikácie ConsoleApp2 zobrazíte výstup.

6. Súkromné ​​chránené

Toto je odborová kombinácia modifikátorov súkromného aj chráneného prístupu. Chránené interné prostriedky Chránené ALEBO interné. Súkromné ​​objekty nie sú prístupné mimo kódového bloku, v ktorom sú deklarované, zatiaľ čo chránené objekty sú prístupné ktorejkoľvek odvodenej triede v akejkoľvek zostave. Čo ak chcem obmedziť prístup môjho objektu aj v odvodených triedach v iných zostavách? Jednoduché riešenie - deklarujte ho ako interné chránené.

príklad

Upravme úroveň prístupu 'x' v ConsoleApp1 na 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();
)
)
)

Výkon:

Tabuľkové porovnanie

Prístup k špecifikátoru Rovnaké zhromaždenie Iné zhromaždenie
Rovnaká triedaOdvodená triedaNederivovaná triedaOdvodená triedaNederivovaná trieda
SúkromnéÁnožiadnyžiadnyžiadnyžiadny
verejnosťÁnoÁnoÁnoÁnoÁno
chránenýÁnoÁnožiadnyÁnožiadny
internýÁnoÁnoÁnožiadnyžiadny
Chránené interneÁnoÁnoÁnoÁnožiadny
Súkromné ​​chránenéÁnoÁnožiadnyžiadnyžiadny

záver

Vo vyššie uvedenom článku sme videli, že modifikátory prístupu riadia prístup k všetkému v projekte. Rôzne kombinácie úrovní prístupu pokrývajú potreby rôznych druhov prístupnosti. Vývojári si musia zvoliť múdro, pričom musia mať na pamäti bezpečnosť a absolútnu nevyhnutnosť toho, aby bol objekt prístupný v určitom bloku kódu.

Odporúčané články

Toto je sprievodca modifikátormi prístupu v jazyku C #. Tu sme diskutovali Úvodné typy modifikátorov prístupu v C # spolu s príkladmi a výstupmi. Viac informácií nájdete aj v ďalších navrhovaných článkoch -

  1. C # Kompilátory
  2. Destruktor v C #
  3. Čo je TypeScript?
  4. Čo sú webové služby ASP.Net?
  5. Modifikátory prístupu v PHP
  6. Pracovné a najlepšie 3 metódy výčtu v C #

Kategórie: