C# Access Modifiers: Public, Private, Protected, Internal en Meer
C# Access Modifiers Begrijpen
Deze gids legt uit hoe de diverse C# access modifiers — public, private, protected, internal, protected internal en private protected — de zichtbaarheid van types en leden controleren. Realistische codevoorbeelden illustreren elk modifier's effect.
In C# bepalen access modifiers wie velden kan lezen of schrijven, methodes kan aanroepen of types kan instantiëren. Bijvoorbeeld:
class Student {
public string name;
private int num;
}
Hier is name overal zichtbaar, terwijl num beperkt is tot de Student klasse.
Typen Access Modifiers
- public
- private
- protected
- internal
- protected internal
- private protected
1. Public Access Modifier
Een type of lid gemarkeerd als public maakt het toegankelijk vanuit elke code die de assembly kan refereren.
using System;
namespace MyApplication {
class Student {
public string name = "Sheeran";
public void Print() {
Console.WriteLine("Hallo vanuit Student klasse");
}
}
class Program {
static void Main(string[] args) {
Student student1 = new Student();
Console.WriteLine("Naam: " + student1.name);
student1.Print();
Console.ReadLine();
}
}
}
Output
Naam: Sheeran Hallo vanuit Student klasse
Omdat zowel het veld als de methode public zijn, kan de Program klasse ze vrij benaderen.
Tip: Het object student1 wordt gebruikt om de leden van Student te benaderen. Meer leren over C# class and objects.
2. Private Access Modifier
Een private lid is alleen zichtbaar binnen de declarerende class of struct. Buitencode, zoals dergelijke leden, triggeren compileerfouten.
using System;
namespace MyApplication {
class Student {
private string name = "Sheeran";
private void Print() {
Console.WriteLine("Hallo vanuit Student klasse");
}
}
class Program {
static void Main(string[] args) {
Student student1 = new Student();
Console.WriteLine("Naam: " + student1.name);
student1.Print();
Console.ReadLine();
}
}
}
Het proberen name of Print te benaderen vanuit Program resulteert in:
CS0122 'Student.name' is inaccessible due to its protection level
CS0122 'Student.Print()' is inaccessible due to its protection level
3. Protected Access Modifier
Leden gemarkeerd protected zijn toegankelijk binnen hun eigen klasse en alle afgeleide klassen, ongeacht assembly.
using System;
namespace MyApplication {
class Student {
protected string name = "Sheeran";
}
class Program : Student {
static void Main(string[] args) {
Program program = new Program();
Console.WriteLine("Naam: " + program.name);
Console.ReadLine();
}
}
}
Output
Naam: Sheeran
Hier erft Program van Student, wat het in staat stelt de protected name veld te benaderen.
4. Internal Access Modifier
Een internal lid is alleen zichtbaar binnen dezelfde assembly — een logische eenheid van gecompileerde code. Assemblies worden aangemaakt door de compiler bij het bouwen van een project.
Binnen een enkele assembly:
using System;
namespace Assembly {
class Student {
internal string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
Student theStudent = new Student();
Console.WriteLine("Naam: " + theStudent.name);
Console.ReadLine();
}
}
}
Output
Naam: Sheeran
Wanneer dezelfde assembly probeert het veld te benaderen, gedraagt het zich als public omdat internal leden gedeeld worden over de hele assembly.
In een andere assembly is het veld onbereikbaar:
// Assembly1
using System;
namespace Assembly1 {
public class StudentName {
internal string name = "Sheeran";
}
}
// Assembly2
using System;
using Assembly1;
namespace Assembly2 {
class Program {
static void Main(string[] args) {
StudentName student = new StudentName();
Console.Write(student.name); // CS0122
Console.ReadLine();
}
}
}
Het compileren van Assembly2 produceert:
CS0122 'StudentName.name' is inaccessible due to its protection level
5. Protected Internal Access Modifier
De protected internal combinatie staat toegang toe vanuit dezelfde assembly of van afgeleide typen in andere assemblies.
// Assembly1
using System;
namespace Assembly1 {
public class Greet {
protected internal string msg = "Hallo";
}
}
// Assembly2
using System;
using Assembly1;
namespace Assembly2 {
class Program : Greet {
static void Main(string[] args) {
Program greet = new Program();
Console.Write(greet.msg);
Console.ReadLine();
}
}
}
Output
Hallo
6. Private Protected Access Modifier
Geïntroduceerd in C# 7.2, private protected beperkt zichtbaarheid tot de declarerende klasse en afgeleide klassen binnen dezelfde assembly.
// Assembly1
using System;
namespace Assembly1 {
public class StudentName {
private protected string name = "Sheeran";
}
class Program1 : StudentName {
static void Main(string[] args) {
Program1 student = new Program1();
Console.Write(student.name);
Console.ReadLine();
}
}
}
// Assembly2
using System;
using Assembly1;
namespace Assembly2 {
class Program : StudentName {
static void Main(string[] args) {
Program student = new Program();
Console.Write(student.name); // CS0122
Console.ReadLine();
}
}
}
Toegang vanuit Assembly2 faalt omdat het lid niet blootgelegd is buiten zijn assembly, zelfs niet in afgeleide typen.
Let op: Terwijl typen (klassen, interfaces, etc.) public en internal kunnen gebruiken, gelden alle andere modifiers alleen voor leden.
C Taal
- C# Classes & Objects: Fundamenten voor Robuuste OOP
- C# Static Keyword: Static Variabelen, Methodes en Classes Beheersen
- C# Abstract Classes & Methods: Een Praktische Gids
- C# Geneste Classes: Definitie, Gebruik en Inheritance
- C# Partial Classes en Methods: Een Praktische Gids
- C# Sealed Classes en Methods: Wanneer en Hoe Te Gebruiken
- C++ Class Templates Beheersen: Een Praktische Gids
- C-opslagklassen begrijpen: Bereik, levensduur en prestaties
- Polymorfisme in C++ Begrijpen: Een Praktische Gids
- Data Abstractie in C++ Beheersen: Ontwerp Vereenvoudigen met Interface-Implementatie Scheiding
- Java Modifiers Uitgelegd: Typen, Gebruik en Best Practices