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

C# Zugriffsmodifizierer verstehen: Public, Private, Protected, Internal und mehr

C# Zugriffsmodifizierer verstehen

Dieser Leitfaden erklärt, wie die verschiedenen C# Zugriffsmodifizierer – public, private, protected, internal, protected internal und private protected – die Sichtbarkeit von Typen und Membern steuern. Praktische Codebeispiele illustrieren die Wirkung jedes Modifizierers.

In C# bestimmen Zugriffsmodifizierer, wer Felder lesen oder schreiben, Methoden aufrufen oder Typen instanziieren kann. Zum Beispiel:

class Student {
    public string name;
    private int num;
}

Hier ist name überall sichtbar, während num auf die Student Klasse beschränkt ist.

Arten von Zugriffsmodifizierern


1. Public Zugriffsmodifizierer

Ein Typ oder Member als public zu kennzeichnen, macht ihn von jedem Code aus zugänglich, der die Assembly referenzieren kann.

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) {
            Student student1 = new Student();
            Console.WriteLine("Name: " + student1.name);
            student1.Print();
            Console.ReadLine();
        }
    }
}

Ausgabe

Name: Sheeran Hello from Student class

Da sowohl Feld als auch Methode public sind, kann die Program Klasse frei darauf zugreifen.

Tipp: Das Objekt student1 wird verwendet, um auf die Member von Student zuzugreifen. Mehr über C# Klasse und Objekte.


2. Private Zugriffsmodifizierer

Ein private Member ist nur innerhalb seiner deklarierenden class oder struct sichtbar. Externer Code löst Compilerfehler aus.

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) {
            Student student1 = new Student();
            Console.WriteLine("Name: " + student1.name);
            student1.Print();
            Console.ReadLine();
        }
    }
}

Der Versuch, von Program auf name oder Print zuzugreifen, ergibt:

CS0122 'Student.name' is inaccessible due to its protection level
CS0122 'Student.Print()' is inaccessible due to its protection level

3. Protected Zugriffsmodifizierer

Mit protected gekennzeichnete Member sind innerhalb ihrer eigenen Klasse und aller abgeleiteten Klassen zugänglich, unabhängig von der 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("Name: " + program.name);
            Console.ReadLine();
        }
    }
}

Ausgabe

Name: Sheeran

Hier erbt Program von Student, was den Zugriff auf das geschützte name Feld ermöglicht.


4. Internal Zugriffsmodifizierer

Ein internal Member ist nur innerhalb derselben Assembly sichtbar – einer logischen Einheit kompilierten Codes. Assemblies werden vom Compiler beim Bauen eines Projekts erstellt.

Innerhalb einer einzelnen Assembly:

using System;
namespace Assembly {
    class Student {
        internal string name = "Sheeran";
    }
    class Program {
        static void Main(string[] args) {
            Student theStudent = new Student();
            Console.WriteLine("Name: " + theStudent.name);
            Console.ReadLine();
        }
    }
}

Ausgabe

Name: Sheeran

Innerhalb derselben Assembly verhält sich der Zugriff wie public, da interne Member über die gesamte Assembly geteilt werden.

In einer anderen Assembly ist der Member unzugänglich:

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

Der Versuch, Assembly2 zu kompilieren, erzeugt:

CS0122 'StudentName.name' is inaccessible due to its protection level

5. Protected Internal Zugriffsmodifizierer

Die protected internal Kombination erlaubt Zugriff aus derselben Assembly oder von abgeleiteten Typen in anderen Assemblies.

// Assembly1
using System;
namespace Assembly1 {
    public class Greet {
        protected internal string msg = "Hello";
    }
}
// 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();
        }
    }
}

Ausgabe

Hello

6. Private Protected Zugriffsmodifizierer

Mit C# 7.2 eingeführt, beschränkt private protected die Sichtbarkeit auf die deklarierende Klasse und ihre abgeleiteten Klassen innerhalb derselben 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();
        }
    }
}

Der Zugriff aus Assembly2 schlägt fehl, da der Member nicht über seine Assembly hinaus verfügbar gemacht wird, selbst nicht in abgeleiteten Typen.

Hinweis: Während Typen (Klassen, Interfaces, etc.) public und internal verwenden können, gelten alle anderen Modifizierer nur für Member.

C Sprache

  1. C# Klassen & Objekte: Fundamente für robustes OOP
  2. C# Static Keyword: Statische Variablen, Methoden und Klassen meistern
  3. C# Abstrakte Klassen & Methoden meistern: Praktischer Leitfaden
  4. C# Geschachtelte Klassen verstehen: Definition, Verwendung und Vererbung
  5. C# Partielle Klassen und Methoden verstehen
  6. Versiegelte Klassen und Methoden in C# meistern
  7. C++ Klassentemplates meistern: Ein praktischer Leitfaden
  8. C Speicherklassen verstehen: Gültigkeitsbereich, Lebensdauer und Performance
  9. Java Modifikatoren erklärt: Typen, Verwendung und Best Practices
  10. Polymorphie in C++: Praktischer Leitfaden