Introduktion till åtkomstmodifierare i C #

Den här artikeln täcker det mest elementära begreppet objektorienterad programmering ur C # -programmets språk. Konceptet kallas - Access Modifiers. Den allra första frågan att svara är - Vad är Access Modifiers? Enkelt uttryckt kontrollerar åtkomstmodifierare vilka objekt / variabler / konstanter / metoder (praktiskt taget allt) som kan nås i vilken del av koden. Tillgångsmodifierare spelar en viktig roll för att bevisa begreppet Abstraktion i objektorienterad programmering. De styr vilken del av programmet som ska vara och bör inte vara synliga för slutanvändaren. Naturligtvis är en slutanvändare minst orolig för de konstanter och variabler som är involverade i algoritmen. Han är bara bekymrad över vilken metod han behöver använda för att få utdata.

Typer av åtkomstmodifierare i C #

C # ger oss fyra typer av åtkomstmodifierare:

  • Privat (standardåtkomstmodifieraren, förutom enums och gränssnitt)
  • Skyddad (något begränsad)
  • Offentligt (obegränsat, standardvalet för enums och gränssnitt)
  • Internt (offentligt inom samma församling)

Bortsett från dessa fyra åtkomstmodifierare finns det ytterligare två åtkomstnivåkombinationer -

  • Skyddad intern
  • Privat skyddad

Låt oss förstå var och en med ett exempel.

1. Privat

Privat är den mest begränsade åtkomstnivån. Det är också standardåtkomstmodifieraren för alla konstanter, variabler, användardefinierade objekt etc. Endast enums och gränssnitt är offentliga som standard. Så om du inte anger någon åtkomstmodifierare tilldelar C # standardmodifieraren till den.

Privata objekt är inte tillgängliga utanför kroppen i klassen eller strukturen eller programdelen där de deklareras. Varje försök att komma åt objektet utanför ramen för kroppen där det förklaras resulterar i ett kompileringstidsfel.

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

Utgång 1:

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

Utgång 2:

2. Skyddad

Specifikationen för skyddad åtkomst begränsar ett objekt till att endast vara tillgängligt från härledda instanser av klassen. Så om ett barnklassobjekt försöker få åtkomst till skyddade objekt i en förälderklass är det tillåtet. Icke-härledda klasser kan inte få åtkomst till skyddade medlemmar i någon klass. Naturligtvis är skyddade objekt tillgängliga för metoder i egen klass.

Exempel

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

Utgång 3:

3. Offentligt

Detta är den minst begränsade åtkomstmodifieraren. Offentliga objekt är praktiskt taget tillgängliga för hela omvärlden, vilket gör det till den högsta tillåtna åtkomstmodifieraren. Naturligtvis kommer detta till en tung kostnad - kostnaden för minst skydd.

Offentliga medlemmar kan nås av valfri del av koden. Detta gör dem minst säkra. Varje kodlogik kan ändra deras värde som kan leda till oväntat beteende. Så man måste vara mycket försiktig innan man gör något objekt offentligt.

I samma medarbetarklass som vi skapade i vårt exempel på modifiering av privat åtkomst, om vi ändrar åtkomstnivån till allmänheten skulle vi inte behöva några Getter- och Setter-metoder. I själva verket är den bästa praxisen att göra objektet privat och använda C # Getter och Setter-egenskaper.

Exempel

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

Utgång 4:

4. Internt

Interna objekt och metoder är bara tillgängliga inom samma enhet. Detta är en mycket användbar åtkomstmodifierare när du vill göra något objekt offentligt och ändå vill begränsa dess åtkomst endast till det ramverk som du kodar.

Så i huvudsak är alla interna objekt tillgängliga för alla områden i samma enhet.

Låt oss skapa två konsolapplikationer för att förstå detta fungerar.

Exempel

Steg 1: Skapa en C # Console-applikation och placera koden nedan 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);
)
)
)

Steg 2: Bygg lösningen för att hämta .dll-filen från bin-mappen.

Steg 3: Skapa en annan konsolapplikation och referera monteringsfilen från ConsoleApp1. Klicka på Lägg till referens i bilden nedan och bläddra till platsen för .dll-filen från steg 2. Den måste vara lik ~ / ConsoleApp1 / bin / Debug / ConsoleApp1.dll.

När du har lagt till .dll-filen bör du hitta den under Assemblies.

Steg 4: Placera nedanstående kod 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);
)
)
)

Steg 5: När du bygger ConsoleApp2 skulle du få ett kompileringstidsfel som indikerar att 'x' från ConsoleApp1 inte kan nås i andra enheter på grund av dess skyddsnivå.

5. Skyddad intern

Detta är en kombination av både skyddade och interna åtkomstmodifierare. Ett viktigt begrepp att förstå här är att skyddad intern betyder skyddad ELLER intern. Det är en sammanslutning av båda åtkomstmodifierarna. Det får aldrig anses vara en korsning.

Så interna objekt är inte tillgängliga utanför enheten, medan skyddade objekt är tillgängliga för alla härledda klasser i alla enheter. Vad händer om jag bara vill skydda mitt objekt i andra enheter och inte i samma enhet? Enkel lösning - förklara den som skyddad intern.

Exempel

Steg 1: Låt oss ändra vår ConsoleApp1 för att återspegla koden nedan. Observera att vi har ändrat åtkomstnivån för vår variabel 'x' till skyddad 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);
)
)
)

Steg 2: Bygg lösningen igen och ersätt .dll i ConsoleApp2 med den uppdaterade.

Steg 3: Uppdatera koden i ConsoleApp2 enligt nedan:

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

Steg 4: Kör ConsoleApp2 för att se utgången.

6. Privat skyddad

Detta är en facklig kombination av både privata och skyddade åtkomstmodifierare. Skyddad intern betyder skyddad ELLER intern. Så privata objekt är inte tillgängliga utanför kodblocket där det deklareras, medan skyddade objekt är tillgängliga för alla härledda klasser i alla enheter. Vad händer om jag vill begränsa mitt objekts åtkomst även i härledda klasser i andra församlingar? Enkel lösning - förklara den som skyddad intern.

Exempel

Låt oss ändra åtkomstnivån för 'x' i ConsoleApp1 till 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();
)
)
)

Produktion:

Tabelljämförelse

Access Specifier Samma församling Annan församling
Samma klassDeriverad klassIcke-härledd klassDeriverad klassIcke-härledd klass
PrivatJaNejNejNejNej
offentligJaJaJaJaJa
SkyddadeJaJaNejJaNej
InreJaJaJaNejNej
Skyddad internJaJaJaJaNej
Privat skyddadJaJaNejNejNej

Slutsats

Vi har sett i ovanstående artikel att åtkomstmodifierare styr tillgången på allt i projektet. Olika kombinationer av åtkomstnivåer täcker behoven hos olika typer av tillgänglighet. Utvecklarna måste välja klokt och ha i åtanke säkerheten och det absoluta behovet av att objektet ska vara tillgängligt i ett visst kodblock.

Rekommenderade artiklar

Detta är en guide till Access Modifiers i C #. Här har vi diskuterat introduktionstyperna för åtkomstmodifierare i C # tillsammans med exempel och utgångar. Du kan också gå igenom våra andra artiklar som föreslås för att lära dig mer–

  1. C # Compilers
  2. Destruktor i C #
  3. Vad är TypeScript?
  4. Vad är ASP.Net Web Services?
  5. Få åtkomst till modifierare i PHP
  6. Working and Top 3 Enum Methods in C #

Kategori: