Sissejuhatus juurdepääsu modifikaatoritesse C #

See artikkel hõlmab kõige elementaarsemat objektorienteeritud programmeerimise kontseptsiooni C # programmeerimiskeele vaatenurgast. Mõiste on tuntud kui - juurdepääsu muutjad. Esimene küsimus, millele tuleb vastata, on - mis on juurdepääsu muutjad? Lihtsamalt öeldes kontrollivad juurdepääsu modifikaatorid, millistele objektidele / muutujatele / konstantidele / meetoditele (praktiliselt kõigele) pääseb juurde, millisesse koodi osasse pääseb. Juurdepääsu modifikaatoritel on oluline roll abstraktsiooni kontseptsiooni tõestamisel objektipõhises programmeerimises. Nad kontrollivad, milline osa programmist peaks olema ja ei tohiks olla lõppkasutajale nähtavad. Muidugi on lõppkasutaja kõige vähem mures algoritmi kaasatud konstandite ja muutujate pärast. Ta on mures ainult selle pärast, millist meetodit ta väljundi saamiseks kasutama peab.

Juurdepääsumuundurite tüübid C # -s

C # pakub meile nelja tüüpi juurdepääsu modifikaatoreid:

  • Privaatne (vaikejuurdepääsu modifikaator, välja arvatud enumad ja liidesed)
  • Kaitstud (veidi piiratud)
  • Avalik (piiranguteta, vaikevalik enumidele ja liidestele)
  • Sisemine (sama koosseisu avalik)

Peale nende nelja juurdepääsu modifikaatori on veel kaks juurdepääsu taseme kombinatsiooni -

  • Kaitstud sisemine
  • Privaatne kaitstud

Mõistagem mõlemat näitega.

1. Privaatne

Privaatsus on kõige piiratum juurdepääsutase. See on ka kõigi konstantide, muutujate, kasutaja määratletud objektide jms vaikimisi kasutatav pääsemuundur. Ainult enumeed ja liidesed on vaikimisi avalikud. Niisiis, kui te ei määra ühtegi juurdepääsu modifikaatorit, määrab C # sellele vaikemuundaja.

Eraobjektidele pole juurdepääsu väljaspool selle klassi, struktuuri või programmi osa, milles need on deklareeritud. Iga katse pääseda objektile väljaspool selle keha ulatust, milles see deklareeritakse, põhjustab kompileerimise aja vea.

Näide nr 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. väljund:

Näide 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. väljund:

2. Kaitstud

Kaitstud juurdepääsu spetsifikaator piirab objektile ligipääsu ainult klassi tuletatud eksemplaridest. Seega, kui lasteklassi objekt üritab pääseda vanema klassi kaitstud objektidele, on see lubatud. Tuletatud klassid ei pääse juurde ühegi klassi kaitstud liikmetele. Muidugi on kaitstud objektid juurdepääsetavad oma klassi meetoditele.

Näide

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. väljund:

3. Avalik

See on kõige vähem piiratud juurdepääsuga modifikaator. Avalikud objektid on praktiliselt ligipääsetavad kogu välismaailmale, muutes selle kõrgeimaks lubatud juurdepääsu muutjaks. Muidugi tuleb see kaasa suurte kuludega - kõige vähem kaitsega.

Avalikele liikmetele pääseb juurde koodide mis tahes osa kaudu. See muudab nad kõige vähem turvaliseks. Mis tahes koodiloogikaga saab nende väärtust muuta, mis võib põhjustada ootamatut käitumist. Niisiis, enne mis tahes objekti avalikustamist tuleb olla väga ettevaatlik.

Samas töötajaklassis, mille lõime oma privaatse juurdepääsu muutmise näites, ei vajaksime juurdepääsu taseme avalikkusele muutmiseks ühtegi Getteri ja Setteri meetodit. Tegelikult on parim tava muuta objekt privaatseks ja kasutada C # Getteri ja Setteri atribuute.

Näide

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. väljund:

4. Sisemine

Siseobjektidele ja -meetoditele pääseb juurde ainult sama komplekti piires. See on väga kasulik juurdepääsu modifikaator, kui soovite mis tahes objekti avalikustada ja soovite siiski piirata selle juurdepääsu ainult teie kodeeritavale raamistikule.

Nii et sisuliselt on kõik sisemised objektid juurdepääsetavad sama koosseisu kõigisse piirkondadesse.

Loome selle toimimise mõistmiseks kaks konsoolirakendust.

Näide

1. samm: looge C # konsoolirakendus ja sisestage sellesse järgmine kood:

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. samm: looge lahendus .dll-faili saamiseks kaustast bin.

3. samm: looge veel üks konsoolirakendus ja viige ConsoleApp1-st koostefail. Klõpsake alloleval pildil käsku Lisa viide ja sirvige alates 2. sammust .dll-faili asukohta. See peab sarnanema failiga ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

Pärast .dll-faili lisamist peaksite selle leidma jaotisest Assambleed.

4. samm : asetage allolev kood ConsoleApp2-sse.

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. samm : kui loote ConsoleApp2, saate kompilatsiooniaja vea, mis näitab, et ConsoleApp1 tähega x ei saa teistes koostudes juurdepääsu oma kaitsetaseme tõttu.

5. Kaitstud sisemine

See on nii kaitstud kui ka sisemise juurdepääsu modifikaatorite kombinatsioon. Oluline mõiste, mida siin mõista, on see, et kaitstud sisemine tähendab kaitstud või sisemist. See on mõlema juurdepääsu modifikaatori liit. Seda ei tohi kunagi arvata ristmikuks.

Niisiis, sisemistele objektidele pole juurdepääsu väljaspool koostu, samas kui kaitstud objektidele pääseb juurde mis tahes tuletatud klassiga mis tahes koosseisus. Mis saab siis, kui tahan kaitsta oma eset ainult teistes koostudes ja mitte samas koosseisus? Lihtne lahendus - kuulutage see kaitstuks sisemiseks.

Näide

1. samm: muutkem oma ConsoleApp1, et see kajastaks allolevat koodi. Märkus. Oleme muutnud muutuja „x” juurdepääsu taseme kaitstud sisemiseks.

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. samm: looge lahendus uuesti ja asendage ConsoleApp2 .dll uuendatud versiooniga.

3. samm: värskendage koodi ConsoleApp2-s järgmiselt:

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. samm: väljundi nägemiseks käivitage ConsoleApp2.

6. Privaatne kaitstud

See on nii privaatse kui ka kaitstud juurdepääsu modifikaatorite liitkombinatsioon. Kaitstud sisemine tähendab kaitstud VÕI sisemist. Nii et privaatsetele objektidele pole juurdepääsu väljaspool koodiplokki, milles see deklareeritakse, samal ajal kui kaitstud objektidele pääseb juurde mis tahes tuletatud klassiga mis tahes komplektis. Mis saab siis, kui tahan piirata oma objekti juurdepääsu isegi teistes koostudes tuletatud klassidele? Lihtne lahendus - kuulutage see kaitstuks sisemiseks.

Näide

Muutkem ConsoleApp1-s juurdepääsu x-taseme juurdepääsu privaatseks kaitstud tasemele.

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äljund:

Tabelvõrdlus

Juurdepääsu spetsifikaator Sama assamblee Muu assamblee
Sama klassTuletatud klassTuletamata klassTuletatud klassTuletamata klass
PrivaatneJahEiEiEiEi
AvalikJahJahJahJahJah
KaitstudJahJahEiJahEi
SisemineJahJahJahEiEi
Kaitstud sisemineJahJahJahJahEi
Privaatne kaitstudJahJahEiEiEi

Järeldus

Ülaltoodud artiklist nägime, et juurdepääsu modifikaatorid kontrollivad projekti kõige juurdepääsu. Juurdepääsutasandite erinevad kombinatsioonid katavad mitmesuguse juurdepääsetavuse vajadused. Arendajad peavad valima targalt, pidades silmas objekti turvalisust ja absoluutset vajadust, et see oleks teatud koodiplokis juurdepääsetav.

Soovitatavad artiklid

See on juhend pääsemuunduritele C # -s. Siin oleme arutanud C # sissejuhatuse juurdepääsu modifikaatorite tüüpe koos näidete ja väljunditega. Lisateavet leiate ka meie muudest soovitatud artiklitest -

  1. C # Koostajad
  2. C-tüüpi hävitaja
  3. Mis on TypeScript?
  4. Mis on ASP.Net veebiteenused?
  5. Juurdepääs modifikaatoritele PHP-s
  6. Töötavad ja 3 parimat Enumi meetodit C # -s

Kategooria: