C#-Zugriffsmodifikatoren
C#-Zugriffsmodifikatoren
In diesem Tutorial lernen wir anhand von Beispielen die öffentlichen, privaten, geschützten und internen Zugriffsmodifikatoren in C# kennen.
In C# geben Zugriffsmodifikatoren den Zugriff auf Typen (Klassen, Schnittstellen usw.) und Typmitglieder (Felder, Methoden usw.) an. Zum Beispiel
class Student {
public string name;
private int num;
}
Hier,
- Name - öffentliches Feld, auf das von überall aus zugegriffen werden kann
- Zahl - auf das private Feld kann nur innerhalb des Student zugegriffen werden Klasse
Arten von Zugriffsmodifikatoren
In C# gibt es 4 Grundtypen von Zugriffsmodifikatoren.
- öffentlich
- privat
- geschützt
- intern
1. Modifikator für öffentlichen Zugriff
Wenn wir einen Typ oder Typmember public
deklarieren , es kann von überall darauf zugegriffen werden. Zum Beispiel
using System;
namespace MyApplication {
class Student {
public string name = "Sheeran";
public void print() {
Console.WriteLine("Hello from Student class");
}
}
class Program {
static void Main(string[] args) {
// creating object of Student class
Student student1 = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
Console.ReadLine();
}
}
}
Ausgabe
Name: Sheeran Hello from Student class
Im obigen Beispiel haben wir eine Klasse namens Student erstellt mit einem Feld name und eine Methode print() .
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
Da das Feld und die Methode öffentlich sind, können wir über das Programm darauf zugreifen Klasse.
Hinweis :Wir haben das Objekt student1 verwendet des Schülers Klasse, um auf ihre Mitglieder zuzugreifen. Weitere Informationen finden Sie unter C#-Klassen und -Objekte .
2. privater Zugriffsmodifikator
Wenn wir einen Typmember mit dem private
deklarieren Zugriffsmodifikator, es kann nur innerhalb desselben class
zugegriffen werden oder struct
. Zum Beispiel
using System;
namespace MyApplication {
class Student {
private string name = "Sheeran";
private void print() {
Console.WriteLine("Hello from Student class");
}
}
class Program {
static void Main(string[] args) {
// creating object of Student class
Student student1 = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
Console.ReadLine();
}
}
}
Im obigen Beispiel haben wir eine Klasse namens Student erstellt mit einem Feld name und eine Methode print() .
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
// accessing print method from Student
student1.print();
Da das Feld und die Methode privat sind, können wir vom Programm nicht darauf zugreifen Klasse. Hier generiert der Code den folgenden Fehler.
Error CS0122 'Student.name' is inaccessible due to its protection level
Error CS0122 'Student.print()' is inaccessible due to its protection level
3. geschützter Zugriffsmodifikator
Wenn wir einen Typmember als protected
deklarieren , kann nur von derselben Klasse und ihren abgeleiteten Klassen aus darauf zugegriffen werden. Zum Beispiel
using System;
namespace MyApplication {
class Student {
protected string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
// creating object of student class
Student student1 = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + student1.name);
Console.ReadLine();
}
}
}
Im obigen Beispiel haben wir eine Klasse namens Student erstellt mit einem Feld name . Da das Feld geschützt ist, können wir vom Programm aus nicht darauf zugreifen Klasse.
Hier generiert der Code den folgenden Fehler.
Error CS0122 'Student.name' is inaccessible due to its protection level
Versuchen wir nun, auf protected
zuzugreifen Member aus einer abgeleiteten Klasse.
using System;
namespace MyApplication {
class Student {
protected string name = "Sheeran";
}
// derived class
class Program : Student {
static void Main(string[] args) {
// creating object of derived class
Program program = new Program();
// accessing name field and printing it
Console.WriteLine("Name: " + program.name);
Console.ReadLine();
}
}
}
Ausgabe
Name: Sheeran
Im obigen Beispiel haben wir eine Klasse Student erstellt mit einem geschützten Feld name . Beachten Sie, dass wir das Programm geerbt haben Klasse vom Student Klasse.
// accessing name field and printing it
Console.WriteLine("Name: " + program.name);
Seit protected
Member von abgeleiteten Klassen aus zugegriffen werden kann, können wir auf name zugreifen aus dem Programm Klasse.
4. interner Zugriffsmodifikator
Wenn wir einen Typ oder Typmember als internal
deklarieren , kann nur innerhalb derselben Assembly zugegriffen werden.
Eine Assembly ist eine Sammlung von Typen (Klassen, Schnittstellen usw.) und Ressourcen (Daten). Sie sind so aufgebaut, dass sie zusammenarbeiten und eine logische Funktionseinheit bilden.
Aus diesem Grund werden beim Ausführen einer Assembly alle Klassen und Schnittstellen innerhalb der Assembly zusammen ausgeführt. Um mehr zu erfahren, besuchen Sie die C# Assembly.
Beispiel:intern innerhalb derselben Assembly
using System;
namespace Assembly {
class Student {
internal string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
// creating object of Student class
Student theStudent = new Student();
// accessing name field and printing it
Console.WriteLine("Name: " + theStudent.name);
Console.ReadLine();
}
}
}
Ausgabe
Name: Sheeran
Im obigen Beispiel haben wir eine Klasse namens Student erstellt mit einem Feld name . Da das Feld internal
ist , können wir über das Programm darauf zugreifen Klasse, da sie sich in derselben Assembly befinden.
Wenn wir internal
verwenden innerhalb einer einzelnen Assembly funktioniert es genauso wie public
Zugriffsmodifikator.
Beispiel:intern in unterschiedlicher Assembly
Lassen Sie uns zuerst eine Assembly erstellen.
// Code on Assembly1
using System;
namespace Assembly1 {
public class StudentName {
internal string name = "Sheeran";
}
class Program {
static void Main(string[] args) {
}
}
}
Hier befindet sich dieser Code in Assembly1 . Wir haben ein internes Feld name erstellt innerhalb der Klasse StudentName . Jetzt kann auf dieses Feld nur noch von derselben Assembly Assembly1 aus zugegriffen werden .
Lassen Sie uns nun eine weitere Assembly erstellen.
// Code on Assembly2
using System;
// access Assembly1
using Assembly1;
namespace Assembly2 {
class Program {
static void Main(string[] args) {
StudentName student = new StudentName();
// accessing name field from Assembly1
Console.Write(student.name);
Console.ReadLine();
}
}
}
Hier befindet sich dieser Code in Assembly2 . Wir versuchen, auf den Namen zuzugreifen Feld des StudentName class(Assembly1 ).
Um auf Felder von Assembly1 zuzugreifen , müssen wir zuerst die Referenz von Assembly1 setzen in Montage2 . Jetzt der Code
using Assembly1;
erlaubt uns, den Code von Assembly1 zu verwenden zu Assembly2 .
Hier, wenn wir versuchen, auf den Namen zuzugreifen Feld aus Assembly2 , erhalten wir eine Fehlermeldung.
Error CS0122 'StudentName.name' is inaccessible due to its protection level
Das liegt daran, dass name ist ein internes Feld in Assembly1 .
5. geschützter interner Zugriffsmodifikator
Die protected internal
ist eine Kombination aus protected
und internal
Zugriffsmodifikatoren.
Wenn wir ein Mitglied deklarieren protected internal
, kann von derselben Assembly und von jeder anderen Assembly aus auf die abgeleitete Klasse der enthaltenden Klasse zugegriffen werden.
// Code on Assembly1
using System;
namespace Assembly1 {
public class Greet {
protected internal string msg="Hello";
}
class Program {
static void Main(string[] args) {
Greet greet = new Greet();
Console.WriteLine(greet.msg);
Console.ReadLine();
}
}
}
Ausgabe
Hello
Der obige Code befindet sich in Assembly1 .
Im obigen Beispiel haben wir eine Klasse namens Greet erstellt mit einem Feld msg . Da das Feld intern geschützt ist, können wir vom Programm darauf zugreifen Klasse, da sie sich in derselben Assembly befinden.
Lassen Sie uns eine Klasse von Greet ableiten in einer anderen Assembly und versuchen Sie, auf das geschützte interne Feld msg zuzugreifen daraus.
// Code on Assembly2
using System;
// access Assembly1
using Assembly1;
namespace Assembly2 {
// derived class of Greet
class Program: Greet {
static void Main(string[] args) {
Program greet = new Program();
// accessing name field from Assembly1
Console.Write(greet.msg);
Console.ReadLine();
}
}
}
Ausgabe
Hello
Der obige Code befindet sich in Assembly2 .
Im obigen Beispiel haben wir das Programm geerbt Klasse vom Greet Klasse (von Assembly1 ).
// accessing name field from Assembly1
Console.Write(greet.msg);
Wir können auf die msg zugreifen vom Gruß Klasse von Assembly1 von Assembly2 .
Das liegt daran, dass die msg ist ein geschütztes internes Feld und wir versuchen, von der untergeordneten Klasse von Greet darauf zuzugreifen .
6. privater geschützter Zugriffsmodifikator
Die private protected
Zugriffsmodifikator ist eine Kombination aus private
und protected
. Es ist ab der C#-Version 7.2 und höher verfügbar.
Wenn wir ein Mitglied deklarieren private protected
, kann nur innerhalb derselben Klasse und auf ihre abgeleitete Klasse innerhalb derselben Assembly zugegriffen werden. Zum Beispiel
// Code in Assembly1
using System;
namespace Assembly1 {
public class StudentName {
private protected string name = "Sheeran";
}
//derived class of StudentName class
class Program1 : StudentName {
static void Main(string[] args) {
Program1 student = new Program1();
// accessing name field from base class
Console.Write(student.name);
Console.ReadLine();
}
}
}
Ausgabe
Sheeran
Der obige Code befindet sich in Assembly1
Im obigen Beispiel haben wir eine Klasse StudentName erstellt mit einem private protected
Feld name .
Beachten Sie, dass wir das Program1 geerbt haben Klasse aus StudentName Klasse.
Seit private protected
Member von abgeleiteten Klassen innerhalb derselben Assembly zugegriffen werden kann, können wir auf name zugreifen aus dem Programm1 Klasse.
Lassen Sie uns eine Klasse von StudentName ableiten in einer anderen Assembly und versuchen Sie, auf das private geschützte Feld name zuzugreifen davon. Zum Beispiel
// Code in Assembly2
using System;
//access Assembly1
using Assembly1;
namespace Assembly2 {
//derived class of StudentName
class Program : StudentName {
static void Main(string[] args) {
Program student = new Program();
// accessing name field from Assembly1
Console.Write(student.name);
Console.ReadLine();
}
}
}
Der obige Code befindet sich in Assembly2
Im obigen Beispiel, wenn wir versuchen, auf name zuzugreifen Feld aus der abgeleiteten Klasse von StudentName , erhalten wir eine Fehlermeldung.
Error CS0122 'StudentName.name' is inaccessible due to its protection level
Das liegt daran, dass der name Feld befindet sich in Assembly1 und die abgeleitete Klasse befindet sich in Assembly2 .
Hinweis Hinweis:Wir können auch Zugriffsmodifikatoren mit Typen (Klassen, Schnittstellen usw.) verwenden. Wir können jedoch nur Typen mit öffentlichen und internen Zugriffsmodifikatoren verwenden.
C Sprache