Introduktion til adgangsmodifikatorer i C #

Denne artikel dækker det mest elementære koncept med objektorienteret programmering set fra C # programmeringssprog. Konceptet er kendt som - Access Modifiers. Det allerførste spørgsmål, der skal besvares, er - Hvad er Access Modifiers? Kort sagt, adgangsmodifikatorer styrer hvilke objekter / variabler / konstanter / metoder (praktisk talt alt) der kan fås adgang til i hvilken del af koden. Adgangsmodifikatorer spiller en vigtig rolle i at bevise begrebet abstraktion i objektorienteret programmering. De styrer, hvilken del af programmet skal være og bør ikke være synligt for slutbrugeren. En slutbruger er selvfølgelig mindst bekymret for de konstanter og variabler, der er involveret i algoritmen. Han er kun bekymret for, hvilken metode han skal bruge for at få output.

Typer af adgangsmodifikatorer i C #

C # giver os fire typer adgangsmodifikatorer:

  • Privat (standardadgangsmodifikator undtagen enums og grænseflader)
  • Beskyttet (let begrænset)
  • Offentlig (ubegrænset, standardvalget for enums og interface)
  • Internt (offentligt inden for samme forsamling)

Bortset fra disse fire adgangsmodifikatorer er der to flere adgangsniveaukombinationer -

  • Beskyttet internt
  • Privat beskyttet

Lad os forstå hver med et eksempel.

1. Privat

Privat er det mest begrænsede adgangsniveau. Det er også standardadgangsmodifikator for alle konstanter, variabler, brugerdefinerede objekter osv. Kun enums og grænseflader er offentlige som standard. Så hvis du ikke specificerer nogen adgangsmodifikator, tildeler C # standardmodifikatoren til det.

Private objekter er ikke tilgængelige uden for kroppen af ​​den klasse eller struktur eller program sektion, hvor de er deklareret. Ethvert forsøg på at få adgang til objektet uden for omfanget af det organ, hvori det er erklæret, resulterer i en kompileringstid-fejl.

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

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

Output 2:

2. Beskyttet

Den beskyttede adgangsspecifikation begrænser et objekt til kun at være tilgængeligt fra afledte tilfælde af klassen. Så hvis et barneklasseobjekt prøver at få adgang til de beskyttede objekter i en forældreklasse, er det tilladt. Ikke-afledte klasser har ikke adgang til beskyttede medlemmer af nogen klasse. Naturligvis er beskyttede genstande tilgængelige for metoder i 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);
)
)

Output 3:

3. Offentligt

Dette er den mindst begrænsede adgangsmodifikator. Offentlige genstande er praktisk taget tilgængelige for hele omverdenen, hvilket gør det til den højest tilladte adgangsmodifikator. Naturligvis kommer dette til en tung pris - omkostningerne til mindst beskyttelse.

Offentlige medlemmer kan fås ved hjælp af hvilken som helst del af koden. Dette gør dem mindst sikre. Enhver kodelogik kan ændre deres værdi, hvilket kan føre til uventet opførsel. Så man skal være meget forsigtig, før man offentliggør noget objekt.

I den samme medarbejderklasse, som vi oprettede i vores eksempel på privat adgangsmodifikator, hvis vi ændrer adgangsniveauet til offentligheden, ville vi ikke have brug for nogen Getter- og Setter-metoder. Faktisk er den bedste praksis at gøre objektet privat og bruge C # Getter og Setter egenskaber.

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

Output 4:

4. Internt

Interne objekter og metoder er kun tilgængelige inden for den samme samling. Dette er en meget nyttig adgangsmodifikator, når du vil offentliggøre et objekt og alligevel kun ønsker at begrænse dets adgang til den ramme, du koder.

Så i det væsentlige er alle interne objekter tilgængelige for alle områder af den samme samling.

Lad os oprette to konsolapplikationer for at forstå dette fungerer.

Eksempel

Trin 1: Opret en C # Console-applikation, og anbring nedenstående kode 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);
)
)
)

Trin 2: Bygg løsningen for at hente .dll-filen fra bin-mappen.

Trin 3: Opret en anden konsoleprogram og henvis til samlingsfilen fra ConsoleApp1. Klik på Tilføj reference på billedet herunder og gennemsøg placeringen af ​​.dll-filen fra trin 2. Den skal svare til ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

Når du har tilføjet .dll-filen, skal du finde den under Assemblies.

Trin 4: Placer nedenstående kode 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);
)
)
)

Trin 5: Når du bygger ConsoleApp2, får du en kompileringstid-fejl, der indikerer, at 'x' fra ConsoleApp1 ikke kan fås i andre enheder på grund af dets beskyttelsesniveau.

5. Beskyttet internt

Dette er en kombination af både beskyttede og interne adgangsmodifikatorer. Et vigtigt begreb at forstå her er, at Protected Internal betyder Protected OR Internal. Det er en forening af begge adgangsmodifikatorer. Det må aldrig antages at være et kryds.

Så interne objekter er ikke tilgængelige uden for samlingen, mens beskyttede objekter er tilgængelige for enhver afledt klasse i enhver samling. Hvad hvis jeg kun vil beskytte mit objekt i andre samlinger og ikke i den samme samling? Enkel løsning - erklær den som beskyttet intern.

Eksempel

Trin 1: Lad os ændre vores ConsoleApp1 for at afspejle koden herunder. Bemærk, at vi har ændret adgangsniveauet for vores variabel 'x' til beskyttet internt.

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

Trin 2: Byg løsningen igen, og erstatt .dll i ConsoleApp2 med den opdaterede.

Trin 3: Opdater 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();
)
)
)

Trin 4: Kør ConsoleApp2 for at se output.

6. Privat beskyttet

Dette er en fagforeningskombination af både private og beskyttede adgangsmodifikatorer. Beskyttet internt betyder beskyttet ELLER internt. Så private objekter er ikke tilgængelige uden for kodeblokken, hvori det er deklareret, mens beskyttede objekter er tilgængelige for enhver afledt klasse i enhver samling. Hvad hvis jeg vil begrænse mit objekt adgang selv i afledte klasser i andre samlinger? Enkel løsning - erklær den som beskyttet intern.

Eksempel

Lad os ændre adgangsniveauet for 'x' i ConsoleApp1 til Privat beskyttet.

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

Produktion:

Tabell sammenligning

Adgangsspecifikation Samme forsamling Anden forsamling
Samme klasseAfledt klasseIkke-afledt klasseAfledt klasseIkke-afledt klasse
PrivatJaIngenIngenIngenIngen
OffentligJaJaJaJaJa
BeskyttetJaJaIngenJaIngen
IndreJaJaJaIngenIngen
Beskyttet interntJaJaJaJaIngen
Privat beskyttetJaJaIngenIngenIngen

Konklusion

Vi har set i ovenstående artikel, at adgangsmodifikatorer styrer adgangen til alt i projektet. Forskellige kombinationer af adgangsniveauer dækker behovene for forskellige slags tilgængelighed. Udviklerne skal vælge klogt at huske på sikkerheden og den absolutte nødvendighed af at objektet skal være tilgængeligt i en bestemt kodeblok.

Anbefalede artikler

Dette er en guide til Access Modifiers i C #. Her har vi drøftet introduktionstyperne af adgangsmodifikatorer i C # sammen med eksempler og output. Du kan også gennemgå vores andre foreslåede artikler for at lære mere–

  1. C # Kompilatorer
  2. Destructor i C #
  3. Hvad er TypeScript?
  4. Hvad er ASP.Net Web Services?
  5. Få adgang til modifikatorer i PHP
  6. Arbejde og top 3 enummetoder i C #

Kategori: