Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
46m 57s
In diesem Artikel werden wir uns mit C#-Zugriffsmodifikatoren beschäftigen, die die Sichtbarkeit und Zugänglichkeit von Typen, Methoden und Variablen in C# definieren. Tim Corey erklärt in seinem Video "C# Access Modifiers (beyond public and private) - what they are, how to use them, and best practices" verschiedene Access Modifiers und demonstriert deren praktische Anwendung in einer Konsolenanwendung.
In diesem Artikel wird erklärt, was Tim abgedeckt hat, zusammen mit Codebeispielen, um Ihr Verständnis zu verbessern. Die Zeitstempel ermöglichen es Ihnen, dem Video zu folgen, um eine praxisnahe Erfahrung zu machen.
Tim Corey beginnt mit einer Einführung in die Zugriffsmodifikatoren und erklärt, dass diese in C# bestimmen, wer eine Ressource sehen und nutzen kann. Während wir mit den allgemein verwendeten öffentlichen und privaten Modifikatoren vertraut sind, erforscht Tim sechs verschiedene Zugriffsmodifikatoren und ihre Anwendungsfälle.
Tim richtet eine einfache Anwendung ein, um zu demonstrieren, wie verschiedene Zugriffsmodifikatoren funktionieren. Die Anwendung besteht aus einer Konsolen-Benutzeroberfläche und einer Demo-Bibliothek, beide im .NET Framework.
public class AccessDemo
{
private void PrivateDemo() { }
internal void InternalDemo() { }
public void PublicDemo() { }
}Public Class AccessDemo
Private Sub PrivateDemo()
End Sub
Friend Sub InternalDemo()
End Sub
Public Sub PublicDemo()
End Sub
End ClassDer private Modifikator schränkt den Zugriff auf die Methode, das Feld oder die Eigenschaft nur innerhalb der Klasse ein, in der sie definiert ist.
public class AccessDemo
{
private void PrivateDemo()
{
Console.WriteLine("Private method can only be accessed within this class.");
}
public void CallPrivateDemo()
{
PrivateDemo(); // Works because it's within the same class
}
}Public Class AccessDemo
Private Sub PrivateDemo()
Console.WriteLine("Private method can only be accessed within this class.")
End Sub
Public Sub CallPrivateDemo()
PrivateDemo() ' Works because it's within the same class
End Sub
End ClassErklärung: Die PrivateDemo-Methode ist nur innerhalb der AccessDemo-Klasse zugänglich. Im Video demonstriert Tim, dass von außerhalb der Klasse nicht darauf zugegriffen werden kann, selbst wenn sich andere Klassen im selben Projekt befinden.
Beste Praxis: Verwenden Sie private, wenn Sie den Zugriff auf die interne Funktionsweise Ihrer Klasse einschränken wollen, um sicherzustellen, dass sie nicht direkt von anderen Teilen Ihrer Anwendung aus geändert werden kann.
Der interne Modifikator ermöglicht den Zugriff auf die Methode oder Eigenschaft nur innerhalb derselben Assembly (des Projekts). Dies ist umfassender als der private Zugriffsmodifikator, da er alle Klassen innerhalb desselben Projekts einschließt.
public class AccessDemo
{
internal void InternalDemo()
{
Console.WriteLine("Internal method is accessible within the same assembly.");
}
}Public Class AccessDemo
Friend Sub InternalDemo()
Console.WriteLine("Internal method is accessible within the same assembly.")
End Sub
End ClassErklärung: Die InternalDemo-Methode kann von jeder Klasse innerhalb desselben Assemblies, jedoch nicht von anderen Assemblies aus aufgerufen werden. Im Video zeigt Tim, dass intern den Zugriff innerhalb des gleichen Projekts erlaubt, aber den Zugriff von außen verweigert.
Best Practice: Verwenden Sie "intern" für Methoden oder Eigenschaften, die nur innerhalb der aktuellen Assembly verwendet werden sollen, z. B. Hilfsfunktionen oder Dienstprogramme, die nicht für externe Projekte zugänglich sein sollten.
Der Modifikator public ermöglicht den Zugriff auf die Methode oder Eigenschaft von jeder anderen Klasse oder Assembly aus. Dies ist die freizügigste Zugriffsstufe.
public class AccessDemo
{
public void PublicDemo()
{
Console.WriteLine("Public method can be accessed from any class.");
}
}Public Class AccessDemo
Public Sub PublicDemo()
Console.WriteLine("Public method can be accessed from any class.")
End Sub
End ClassErklärung: Die PublicDemo-Methode ist von überall zugänglich, einschließlich anderer Klassen im selben Assembly oder anderen Assemblies. Tim zeigt, dass public der am häufigsten verwendete Zugriffsmodifikator ist, insbesondere bei der Freigabe von Methoden in Bibliotheken.
Best Practice: Verwenden Sie public für Methoden und Eigenschaften, auf die andere Teile der Anwendung oder externe Projekte zugreifen müssen, wie API-Endpunkte oder weit verbreitete Dienstprogramme.
Der Protected Modifier erlaubt den Zugriff auf die Methode oder Eigenschaft innerhalb der Klasse, in der sie definiert ist, und in allen abgeleiteten Klassen (Vererbung). Dieser Modifikator ist nützlich für die objektorientierte Programmierung, insbesondere im Falle der Vererbung.
public class AccessDemo
{
protected void ProtectedDemo()
{
Console.WriteLine("Protected method can be accessed within the class and derived classes.");
}
}
public class DerivedClass : AccessDemo
{
public void CallProtectedDemo()
{
ProtectedDemo(); // Accessible because of inheritance
}
}Public Class AccessDemo
Protected Sub ProtectedDemo()
Console.WriteLine("Protected method can be accessed within the class and derived classes.")
End Sub
End Class
Public Class DerivedClass
Inherits AccessDemo
Public Sub CallProtectedDemo()
ProtectedDemo() ' Accessible because of inheritance
End Sub
End ClassErklärung: Die ProtectedDemo-Methode kann von der AccessDemo-Klasse und jeder Klasse, die von ihr erbt, aufgerufen werden. Tim erklärt, dass "protected" bei der Arbeit mit Vererbung weniger verbreitet, aber sehr nützlich ist.
Best Practice: Verwenden Sie protected, wenn Sie abgeleiteten Klassen den Zugriff auf bestimmte Methoden oder Eigenschaften erlauben wollen, diese aber nicht außerhalb der Klassenhierarchie zugänglich sein sollen.
Der private protected-Modifikator kombiniert die Regeln von private und protected. Sie schränkt den Zugriff auf Methoden oder Eigenschaften innerhalb der definierenden Klasse und abgeleiteter Klassen innerhalb derselben Assembly ein. Das bedeutet, dass sie ein höheres Schutzniveau und engere Grenzen für die vererbungsbasierte Zugriffskontrolle bietet als die geschützte.
public class AccessDemo
{
private protected void PrivateProtectedDemo()
{
Console.WriteLine("Private Protected method can be accessed within the same assembly and derived classes.");
}
}
public class DerivedClass : AccessDemo
{
public void CallPrivateProtectedDemo()
{
PrivateProtectedDemo(); // Accessible because of inheritance within the same assembly
}
}
public class UnrelatedClass
{
public void TestAccess()
{
// PrivateProtectedDemo(); // Error: Not accessible in unrelated classes
}
}Public Class AccessDemo
Private Protected Sub PrivateProtectedDemo()
Console.WriteLine("Private Protected method can be accessed within the same assembly and derived classes.")
End Sub
End Class
Public Class DerivedClass
Inherits AccessDemo
Public Sub CallPrivateProtectedDemo()
PrivateProtectedDemo() ' Accessible because of inheritance within the same assembly
End Sub
End Class
Public Class UnrelatedClass
Public Sub TestAccess()
' PrivateProtectedDemo() ' Error: Not accessible in unrelated classes
End Sub
End ClassErklärung: Die PrivateProtectedDemo-Methode ist in der DerivedClass zugänglich, da sie von AccessDemo erbt und im selben Assembly existiert. Jedoch kann darauf in UnrelatedClass nicht zugegriffen werden, da diese Klasse nicht von AccessDemo erbt.
Best Practice: Verwenden Sie den privaten geschützten Zugriffsmodifikator sparsam, wenn Sie den Vererbungszugriff innerhalb derselben Assembly streng kontrollieren müssen. Dies ist besonders in Szenarien nützlich, in denen die Offenlegung von Methoden oder Eigenschaften über Baugruppen hinweg die Kapselung gefährden könnte.
Der geschützte interne Modifikator kombiniert die geschützte und die interne Zugriffsmodifizierungsebene. Sie ermöglicht den Zugriff aus derselben Assembly oder aus abgeleiteten Klassen, auch wenn diese in einer anderen Assembly liegen.
public class AccessDemo
{
protected internal void ProtectedInternalDemo()
{
Console.WriteLine("Protected Internal method can be accessed within the same assembly or from derived classes.");
}
}
public class DerivedClass : AccessDemo
{
public void CallProtectedInternalDemo()
{
ProtectedInternalDemo(); // Accessible due to inheritance
}
}Public Class AccessDemo
Protected Friend Sub ProtectedInternalDemo()
Console.WriteLine("Protected Internal method can be accessed within the same assembly or from derived classes.")
End Sub
End Class
Public Class DerivedClass
Inherits AccessDemo
Public Sub CallProtectedInternalDemo()
ProtectedInternalDemo() ' Accessible due to inheritance
End Sub
End ClassErklärung: Die ProtectedInternalDemo-Methode ist innerhalb desselben Assemblies und auch von jeder abgeleiteten Klasse, unabhängig vom Assembly, zugänglich.
Best Practice: Verwenden Sie protected internal, wenn Sie eine Methode sowohl für abgeleitete Klassen (in anderen Assemblies) als auch für Klassen in derselben Assemblies freigeben wollen, aber nicht für alle.
Tim Corey erklärt, wie wichtig die Verwendung von Zugriffsmodifikatoren ist und warum nicht alles nur öffentlich sein sollte. Alles öffentlich zu machen, mag zwar bequem erscheinen, birgt aber auch erhebliche Risiken wie Datenschutzverletzungen, Bugs und Verwirrung bei der Entwicklung. Zugriffsmodifikatoren dienen dazu, Informationen zu sichern, unbeabsichtigten öffentlichen Zugriff zu verhindern und für Klarheit in Codebases zu sorgen.
Tim erläutert, warum sensible Informationen wie Sozialversicherungsnummern (SSN) oder Kreditkartennummern nicht veröffentlicht werden sollten. Er demonstriert ein Beispiel für eine "schlechte Klasse", bei der Daten aufgrund eines öffentlichen Zugriffs offengelegt werden:
Schlechtes Beispiel:
public class User
{
public string SSN; // Anyone can access and modify it directly
}Public Class User
Public SSN As String ' Anyone can access and modify it directly
End ClassGutes Beispiel:
public class User
{
private string ssn;
public string GetMaskedSSN()
{
return "XXX-XX-" + ssn.Substring(ssn.Length - 4);
}
public void SetSSN(string value)
{
// Add validation if needed
ssn = value;
}
}Public Class User
Private ssn As String
Public Function GetMaskedSSN() As String
Return "XXX-XX-" & ssn.Substring(ssn.Length - 4)
End Function
Public Sub SetSSN(value As String)
' Add validation if needed
ssn = value
End Sub
End ClassBeginn: 35:11
Tim erklärt, dass private Methoden helfen, Verhaltensweisen zu kapseln, die nicht direkt zugänglich sein sollten. Er verwendet das Beispiel einer DeleteUser-Methode als Teil eines größeren Prozesses wie der Mitarbeiterabmeldung.
Schlechtes Beispiel:
public class UserManager
{
public void DeleteUser(int userId)
{
// Deletes the user without considering related processes
}
}Public Class UserManager
Public Sub DeleteUser(userId As Integer)
' Deletes the user without considering related processes
End Sub
End ClassGutes Beispiel:
public class UserManager
{
public void OffboardUser(int userId)
{
RevokeAccess(userId);
DeleteUser(userId); // Used privately as part of offboarding
}
private void DeleteUser(int userId)
{
// Internal logic to delete the user
}
private void RevokeAccess(int userId)
{
// Logic to revoke system access
}
}Public Class UserManager
Public Sub OffboardUser(userId As Integer)
RevokeAccess(userId)
DeleteUser(userId) ' Used privately as part of offboarding
End Sub
Private Sub DeleteUser(userId As Integer)
' Internal logic to delete the user
End Sub
Private Sub RevokeAccess(userId As Integer)
' Logic to revoke system access
End Sub
End ClassZugriffsmodifikatoren verhindern Fehler, indem sie sicherstellen, dass Daten mit der richtigen Validierung gesetzt oder abgerufen werden. Tim veranschaulicht dies mit einem Beispiel, das eine Age-Eigenschaft umfasst.
Schlechtes Beispiel:
public class Person
{
public int Age; // Can be directly set to an invalid value
}Public Class Person
Public Age As Integer ' Can be directly set to an invalid value
End ClassGutes Beispiel:
public class Person
{
private int age;
public int Age
{
get { return age; }
set
{
if (value < 0 || value > 120)
throw new ArgumentOutOfRangeException("Age must be between 0 and 120.");
age = value;
}
}
}Public Class Person
Private _age As Integer
Public Property Age As Integer
Get
Return _age
End Get
Set(value As Integer)
If value < 0 OrElse value > 120 Then
Throw New ArgumentOutOfRangeException("Age must be between 0 and 120.")
End If
_age = value
End Set
End Property
End ClassDie korrekte Verwendung von Zugriffsmodifikatoren vereinfacht die Entwicklung, indem nur das Notwendige offengelegt wird und Verwirrung vermieden wird. Wenn beispielsweise in einer Anwendung mit Tausenden von Methoden nur die öffentlichen Methoden offengelegt werden, wird sichergestellt, dass die Entwickler nur die relevanten Optionen sehen.
Beispiel:
public class MathLibrary
{
public int Add(int a, int b) => a + b;
public int Subtract(int a, int b) => a - b;
private void LogCalculation(string operation, int result)
{
// Logging is internal and not exposed
}
}Public Class MathLibrary
Public Function Add(a As Integer, b As Integer) As Integer
Return a + b
End Function
Public Function Subtract(a As Integer, b As Integer) As Integer
Return a - b
End Function
Private Sub LogCalculation(operation As String, result As Integer)
' Logging is internal and not exposed
End Sub
End ClassFür große Projekte erklärt Tim, wie die richtige Verwendung von Zugriffsmodifikatoren sicherstellt, dass nur die erforderlichen Teile einer Bibliothek offengelegt werden, wodurch die kognitive Belastung für Entwickler, die die Bibliothek verwenden, reduziert wird.
Beispiel:
public class MathLibrary
{
public int Add(int a, int b) => a + b;
public int Subtract(int a, int b) => a - b;
private void LogCalculation(string operation, int result)
{
// Logging is internal and not exposed
}
}Public Class MathLibrary
Public Function Add(a As Integer, b As Integer) As Integer
Return a + b
End Function
Public Function Subtract(a As Integer, b As Integer) As Integer
Return a - b
End Function
Private Sub LogCalculation(operation As String, result As Integer)
' Logging is internal and not exposed
End Sub
End ClassDurch die korrekte Verwendung dieser Zugriffsmodifikatoren erleichtern Sie Ihre Arbeit und die Arbeit der anderen.
Tim Corey bietet einen klaren und praktischen Leitfaden zur Beherrschung von C#-Zugriffsmodifikatoren und zeigt, wie man sie effektiv einsetzt, um sichere, wartbare und professionelle Anwendungen zu erstellen. Seine detaillierten Erklärungen und Beispiele aus der Praxis machen dieses Thema für Entwickler aller Stufen zugänglich.
Um weitere Einblicke zu erhalten und diese Konzepte in Aktion zu sehen, sollten Sie sich Tims vollständiges Video ansehen und seinen Channel für wertvolle Inhalte zu C# und anderen Programmierthemen erkunden. Ein Muss für jeden, der seine Entwicklungsfähigkeiten verbessern möchte!
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy