Introduksjon til tilgangsmodifiserere i C #

Denne artikkelen dekker det mest elementære konseptet med objektorientert programmering fra perspektivet til C # programmeringsspråk. Konseptet er kjent som - Access Modifiers. Det aller første spørsmålet å svare på er - Hva er Access Modifiers? Enkelt sagt, tilgangsmodifiserer styrer hvilke objekter / variabler / konstanter / metoder (praktisk talt alt) som du kan få tilgang til i hvilken del av koden. Tilgangsmodifiserere spiller en viktig rolle i å bevise abstraksjonsbegrepet i objektorientert programmering. De kontrollerer hvilken del av programmet som skal være og skal ikke være synlig for sluttbrukeren. En sluttbruker er selvfølgelig minst bekymret for konstantene og variablene involvert i algoritmen. Han er bare opptatt av hvilken metode han trenger å bruke for å få utdata.

Typer av tilgangsmodifiserere i C #

C # gir oss fire typer tilgangsmodifiserere:

  • Privat (standard tilgangsmodifiserer, unntatt enums og grensesnitt)
  • Beskyttet (litt begrenset)
  • Offentlig (ubegrenset, standardvalget for enums og grensesnitt)
  • Intern (offentlig i samme forsamling)

Bortsett fra disse fire tilgangsmodifisererne, er det to flere tilgangsnivåkombinasjoner–

  • Beskyttet internt
  • Privat beskyttet

La oss forstå hvert enkelt eksempel.

1. Privat

Privat er det mest begrensede tilgangsnivået. Det er også standard tilgangsmodifiserer for alle konstanter, variabler, brukerdefinerte objekter osv. Bare enums og grensesnitt er offentlige som standard. Så hvis du ikke spesifiserer noen tilgangsmodifiserer, tildeler C # standardmodifisereren til den.

Private objekter er ikke tilgjengelige utenfor kroppen av klassen eller strukturen eller programdelen der de er deklarert. Ethvert forsøk på å få tilgang til objektet utenfor omfanget av kroppen der det er erklært, resulterer i en kompilertidsfeil.

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

Utgang 1:

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

Utgang 2:

2. Beskyttet

Spesifisert beskyttet tilgang begrenser et objekt til å være tilgjengelig bare fra avledede forekomster av klassen. Så hvis et barneklasseobjekt prøver å få tilgang til de beskyttede objektene i en foreldreklasse, er det tillatt. Ikke-avledede klasser har ikke tilgang til beskyttede medlemmer av noen klasse. Naturligvis er beskyttede objekter tilgjengelige for metoder fra egen klasse.

Eksempel

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

Utgang 3:

3. Offentlig

Dette er den minst begrensede tilgangsmodifisereren. Offentlige objekter er praktisk tilgjengelig for hele omverdenen, og gjør det dermed til den høyest tillatte tilgangsmodifisereren. Selvfølgelig kommer dette til en tung pris - kostnadene for minst mulig beskyttelse.

Du kan få tilgang til offentlige medlemmer med hvilken som helst del av koden. Dette gjør dem minst sikre. Enhver kodelogikk kan endre verdien som kan føre til uventet oppførsel. Så man må være veldig forsiktig før man offentliggjør noe objekt.

I den samme ansattklassen som vi opprettet i vårt eksempel på privat tilgangsmodifiserer, hvis vi endrer tilgangsnivået til publikum, ville vi ikke trenge noen Getter- og Setter-metoder. Faktisk er den beste praksisen å gjøre objektet privat og bruke C # Getter og Setter egenskaper.

Eksempel

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

Utgang 4:

4. Internt

Interne objekter og metoder er bare tilgjengelige i samme enhet. Dette er en veldig nyttig tilgangsmodifiserer når du vil gjøre et objekt offentlig, og likevel ønsker å begrense tilgangen bare til rammen du koder.

Så i hovedsak er alle interne objekter tilgjengelige for alle områder av samme samling.

La oss lage to konsollprogrammer for å forstå dette.

Eksempel

Trinn 1: Lag et C # Console-program og plasser koden nedenfor i den:

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

Trinn 2: Bygg løsningen for å hente DLL-filen fra søppelmappen.

Trinn 3: Lag et nytt konsollprogram og referer til monteringsfilen fra ConsoleApp1. Klikk på Legg til referanse på bildet nedenfor og bla til plasseringen til .dll-filen fra trinn 2. Den må være lik ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

Etter å ha lagt til .dll-filen, bør du finne den under Assemblies.

Trinn 4: Plasser koden nedenfor i 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);
)
)
)

Trinn 5: Når du bygger ConsoleApp2, vil du få en kompilertidsfeil som indikerer at 'x' fra ConsoleApp1 ikke kan nås i andre enheter på grunn av dets beskyttelsesnivå.

5. Beskyttet internt

Dette er en kombinasjon av både beskyttede og interne tilgangsmodifiserere. Et viktig begrep å forstå her er at Protected Internal betyr Protected OR Internal. Det er en forening av begge tilgangsmodifiserere. Det må aldri antas å være et veikryss.

Så interne objekter er ikke tilgjengelige utenfor enheten, mens beskyttede objekter er tilgjengelige for alle avledede klasser i enhver samling. Hva om jeg bare vil beskytte objektet mitt i andre samlinger og ikke i samme montering? Enkel løsning - erklær den som beskyttet intern.

Eksempel

Trinn 1: La oss endre ConsoleApp1 for å gjenspeile koden nedenfor. Legg merke til at vi har endret tilgangsnivået til variabelen vår x til beskyttet 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);
)
)
)

Trinn 2: Bygg løsningen på nytt og erstatt .dll i ConsoleApp2 med den oppdaterte.

Trinn 3: Oppdater koden i ConsoleApp2 som nedenfor:

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

Trinn 4: Kjør ConsoleApp2 for å se utdataene.

6. Privat beskyttet

Dette er en fagforeningskombinasjon av både private og beskyttede tilgangsmodifiserere. Beskyttet internt betyr beskyttet ELLER internt. Så private objekter er ikke tilgjengelige utenfor kodeblokken den er deklarert i, mens beskyttede objekter er tilgjengelige for enhver avledet klasse i enhver samling. Hva om jeg vil begrense tilgangen til objektet mitt, selv i avledede klasser i andre samlinger? Enkel løsning - erklær den som beskyttet intern.

Eksempel

La oss endre tilgangsnivået til 'x' i ConsoleApp1 til 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();
)
)
)

Produksjon:

Tabell sammenligning

Tilgangspesifikator Samme forsamling Annen forsamling
Samme klasseAvledet klasseIkke-avledet klasseAvledet klasseIkke-avledet klasse
PrivatJaNeiNeiNeiNei
OffentligJaJaJaJaJa
beskyttetJaJaNeiJaNei
InnvendigJaJaJaNeiNei
Beskyttet interntJaJaJaJaNei
Privat beskyttetJaJaNeiNeiNei

Konklusjon

Vi har sett i artikkelen over at tilgangsmodifiserere kontrollerer tilgangen til alt i prosjektet. Ulike kombinasjoner av tilgangsnivåer dekker behovene til forskjellige typer tilgjengelighet. Utviklerne må velge klokt å huske på sikkerheten og den absolutte nødvendigheten av at objektet skal være tilgjengelig i en viss kode.

Anbefalte artikler

Dette er en guide til Access Modifiers i C #. Her har vi diskutert Introduksjonstyper av tilgangsmodifiserere i C # sammen med eksempler og utganger. Du kan også gå gjennom de andre foreslåtte artiklene våre for å lære mer–

  1. C # Kompilatorer
  2. Destructor i C #
  3. Hva er TypeScript?
  4. Hva er ASP.Net Web Services?
  5. Få tilgang til modifikatorer i PHP
  6. Working and Top 3 Enum Methods in C #