Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> C Sprache

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,

Arten von Zugriffsmodifikatoren

In C# gibt es 4 Grundtypen von Zugriffsmodifikatoren.


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

  1. C#-Klasse und -Objekt
  2. Statisches C#-Schlüsselwort
  3. Abstrakte C#-Klasse und -Methode
  4. Verschachtelte C#-Klasse
  5. C# Teilklasse und Teilmethode
  6. Versiegelte C#-Klasse und -Methode
  7. C++-Klassenvorlagen
  8. C Lagerklasse
  9. Java - Modifikatortypen
  10. Polymorphismus in C++