Uvod v Modifikatorje dostopa v C #

Ta članek zajema najbolj elementarni koncept objektno naravnanega programiranja z vidika programskega jezika C #. Koncept je znan kot - Modifikatorji dostopa. Prvo vprašanje, na katerega moramo odgovoriti, je - kaj so Modifikatorji dostopa? Preprosto povedano, modifikatorji dostopa nadzorujejo, do katerih predmetov / spremenljivk / konstant / metod (praktično vsega) je mogoče dostopati v katerem delu kode. Modifikatorji dostopa igrajo pomembno vlogo pri dokazovanju koncepta abstrakcije v objektno usmerjenem programiranju. Nadzirajo, kakšen del programa naj bo in ne sme biti viden končnemu uporabniku. Seveda končnega uporabnika najmanj skrbijo konstante in spremenljivke, vključene v algoritem. Skrbi ga le, na katero metodo se mora sklicevati, če želi dobiti rezultat.

Vrste modifikatorjev dostopa v C #

C # nam ponuja štiri vrste modifikatorjev dostopa:

  • Zasebno (privzeti modifikator dostopa, razen enumov in vmesnikov)
  • Zaščiteno (rahlo omejeno)
  • Javno (neomejeno, privzeta izbira za enume in vmesnike)
  • Notranji (javni v isti skupščini)

Poleg teh štirih modifikatorjev dostopa obstajata še dve kombinaciji ravni dostopa -

  • Zaščitena notranja
  • Zaščiteno zasebno

Razumejmo vsakega s primerom.

1. Zasebno

Zasebni je najbolj omejena stopnja dostopa. Je tudi privzeti modifikator dostopa za vse konstante, spremenljivke, uporabniško definirane predmete itd. Samo enumi in vmesniki so privzeto javni. Če torej ne določite nobenega modifikatorja dostopa, mu C # dodeli privzeti modifikator.

Zasebni predmeti niso dostopni zunaj telesa razreda ali struktur ali programskega odseka, v katerem so prijavljeni. Vsak poskus dostopa do predmeta zunaj področja telesa, v katerem je prijavljen, povzroči napako v času prevajanja.

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

Izhod 1:

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

Izhod 2:

2. Zaščiten

Specifični zaščiteni dostop omeji dostop do objekta samo iz izpeljanih primerkov razreda. Če torej objekt otroškega razreda poskuša dostopati do zaščitenih predmetov nadrejenega razreda, je to dovoljeno. Neizpeljani razredi ne morejo dostopati do zaščitenih članov katerega koli razreda. Seveda so zaščiteni predmeti dostopni metodam lastnega razreda.

Primer

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

Izhod 3:

3. Javno

To je najmanj omejevalnik dostopa. Javni objekti so praktično dostopni celotnemu zunanjemu svetu, s čimer so najvišji dovoljeni modifikator dostopa. To seveda prihaja do visokih stroškov - stroškov najmanj zaščite.

Do javnih članov lahko dostopate s katerim koli delom kode. Zaradi tega so najmanj varni. Vsaka logika kode lahko spremeni njihovo vrednost, kar lahko privede do nepričakovanega vedenja. Pred objavo katerega koli predmeta je treba biti zelo previden.

V istem razredu zaposlenega, ki smo ga ustvarili v našem primeru za spreminjanje zasebnega dostopa, če spremenimo stopnjo dostopa v javno, ne bomo potrebovali nobenih metod Getter in Setter. Pravzaprav je najboljša praksa, da predmet naredite zaseben in uporabite lastnosti C # Getter in Setter.

Primer

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

Izhod 4:

4. Notranji

Notranji predmeti in metode so dostopni samo v istem sklopu. To je zelo uporaben modifikator dostopa, kadar želite kateri koli predmet javno objaviti in kljub temu želite omejiti njegov dostop le na okvir, ki ga kodirate.

Torej so v bistvu vsi notranji predmeti dostopni vsem območjem istega sklopa.

Ustvarimo dve ukazni aplikaciji, da razumemo to delovanje.

Primer

1. korak: Ustvarite aplikacijo za konzolo C # in vanjo vstavite spodnjo kodo:

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. korak: Sestavite rešitev, da dobite datoteko .dll iz mape bin.

3. korak: Ustvarite drugo konzolo in uporabite referenčno datoteko iz ConsoleApp1. Kliknite spodnjo sliko na spodnji sliki in poiščite lokacijo datoteke .dll iz koraka 2. Biti mora podoben ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

Ko dodate datoteko .dll, jo najdite pod sklopi.

4. korak: Spodnjo kodo postavite v 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);
)
)
)

Korak 5: Ko sestavite ConsoleApp2, bi prišlo do napake v času prevajanja, ki kaže, da „x“ iz ConsoleApp1 zaradi njegove zaščite ni mogoče dostopati v drugih sklopih.

5. Zaščiten notranji

To je kombinacija modifikatorja zaščitenega in notranjega dostopa. Pomemben koncept, ki ga moramo tukaj razumeti, je, da zaščiteni notranji pomeni zaščiten ali notranji. Je združenje obeh modifikatorjev dostopa. Nikoli ne sme misliti, da je križišče.

Torej, notranji predmeti niso dostopni zunaj sklopa, medtem ko so zaščiteni predmeti dostopni vsakemu izpeljanemu razredu v katerem koli sestavu. Kaj pa, če želim svoj objekt zaščititi samo v drugih sklopih in ne v isti sestavi? Preprosta rešitev - prijavite jo kot zaščiteno notranjo.

Primer

1. korak: Spremenimo naš ConsoleApp1, da odraža spodnjo kodo. Upoštevajte, da smo spremenili stopnjo dostopa do spremenljivke 'x' v zaščiteno notranjo.

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. korak: Znova sestavite rešitev in zamenjajte .dll v ConsoleApp2 s posodobljeno.

3. korak: Posodobite kodo v ConsoleApp2, kot je spodaj:

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. korak: Zaženite ConsoleApp2 in si oglejte izhod.

6. Zaščiteno zasebno

To je združitev kombinacij zasebnih in zaščitenih modifikatorjev dostopa. Zaščiten Notranji pomeni Zaščiten ALI Notranji. Torej, zasebni predmeti niso dostopni zunaj bloka kode, v katerem je prijavljen, medtem ko so zaščiteni predmeti dostopni vsakemu izpeljanemu razredu v kateri koli sestavi. Kaj pa, če želim omejiti dostop svojega predmeta tudi v izvedene razrede v drugih sklopih? Preprosta rešitev - prijavite jo kot zaščiteno notranjo.

Primer

Spremenimo raven dostopa „x“ v ConsoleApp1 na zasebno zaščiteno.

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

Izhod:

Tabelarična primerjava

Specifični dostop Isti sklop Druga skupščina
Isti razredIzvedeni razredNeizpeljani razredIzvedeni razredNeizpeljani razred
ZasebnoDaNeNeNeNe
JavnoDaDaDaDaDa
ZaščitenoDaDaNeDaNe
NotranjeDaDaDaNeNe
Zaščitena notranjaDaDaDaDaNe
Zaščiteno zasebnoDaDaNeNeNe

Sklep

V zgornjem članku smo videli, da modifikatorji dostopa nadzirajo dostop do vsega v projektu. Različne kombinacije ravni dostopa pokrivajo potrebe različnih vrst dostopnosti. Razvijalci se morajo odločiti pametno in pri tem upoštevati varnost in absolutno potrebo, da bo predmet dostopen v določenem bloku kode.

Priporočeni članki

To je vodnik za Modifikatorje dostopa v C #. Tu smo v C # obravnavali uvodne vrste modifikatorjev dostopa skupaj s primeri in izhodi. Obiščite lahko tudi druge naše predlagane članke, če želite izvedeti več -

  1. C # prevajalniki
  2. Destruktor v C #
  3. Kaj je TypeScript?
  4. Kaj so spletne storitve ASP.Net?
  5. Dostop do modifikatorjev v PHP
  6. Delo in top 3 metode Enum v C #