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
Bu makalede, C#'ta türlerin, yöntemlerin ve değişkenlerin görünürlüğünü ve erişilebilirliğini tanımlayan C# erişim belirleyicilerine dalacağız. Tim Corey, "C# Erişim Belirleyicileri (açık ve özel'in ötesinde) - onlar nedir, nasıl kullanılırlar ve en iyi uygulamalar" videosunda, çeşitli erişim belirleyicilerini açıklar ve bir konsol uygulamasında onların pratik kullanımını gösterir.
Bu makale, Tim'in bahsettiklerini açıklarken, anlamanızı geliştirmek için kod örnekleri ile destekler. Sağlanan zaman damgaları, videoyu takip etmenize olanak tanır ve daha interaktif bir deneyim sağlar.
Tim Corey, erişim belirleyicilerini tanıtarak başlar ve C#'ta bir kaynağı kimlerin görebileceğini ve kullanabileceğini belirlediklerini açıklar. Genellikle kullanılan açık ve özel belirleyiciler ile tanıdık olsak da, Tim altı farklı erişim belirleyicisi ve bunların kullanım durumlarını inceler.
Tim, çeşitli erişim belirleyicilerinin nasıl çalıştığını göstermek için basit bir uygulama kurar. Uygulama, .NET framework içinde hem bir konsol kullanıcı arayüzü hem de bir demo kütüphanesinden oluşur.
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 ClassÖzel belirleyici, erişimi sadece tanımlandığı sınıf içinde yönteme, alana veya özelliğe kısıtlar.
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 ClassAçıklama: PrivateDemo yöntemi yalnızca AccessDemo sınıfı içinde erişilebilir. Videoda, Tim bunun sınıfın dışından erişilemeyeceğini, diğer sınıfların aynı projede olsa bile gösterir.
En İyi Uygulama: Erişimi sınıfınızın içsel işleyişine kısıtlamak istediğinizde özel kullanın, böylece sınıf dışında doğrudan değiştirilmesini engelleyin.
Dahili belirleyici, yönteme veya özelliğe sadece aynı montaj (proje) içinde erişime izin verir. Bu, özel erişim belirleyicisinden daha geniş bir kapsamda, çünkü aynı projedeki tüm sınıfları kapsar.
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 ClassAçıklama: InternalDemo yöntemi aynı derlemede herhangi bir sınıf tarafından erişilebilir, ancak diğer derlemelerden erişilemez. Videoda, Tim dahili tasarımın aynı proje içinde erişime izin verdiğini, ancak dışarıdan erişimi engellediğini gösterir.
En İyi Uygulama: Mevcut montaj içinde kullanılmak üzere tasarlanmış, ancak dış projelere açılmak istemediğiniz yardımcı işlevler veya araçlar için dahili kullanın.
Açık belirleyici, yönteme veya özelliğe herhangi bir sınıf veya montajdan erişime izin verir. Bu, en izin verici erişim seviyesidir.
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 ClassAçıklama: PublicDemo yöntemi, aynı derlemedeki diğer sınıflar veya diğer derlemeler dahil olmak üzere herhangi bir yerden erişilebilir. Tim, kamuya açık belirleyicinin, özellikle kütüphanelerde yöntemleri açıklarken en yaygın belirleyici olduğunu gösteriyor.
En İyi Uygulama: Diğer uygulama veya dış projeler tarafından erişilebilir olması gereken yöntemler ve özellikler için açık kullanın, örneğin, API uç noktalar veya yaygın olarak kullanılan araçlar.
Korunmuş belirleyici, yönteme veya özelliğe tanımlandığı sınıf içinde ve herhangi bir türeyen sınıfta (miras) erişime izin verir. Bu belirleyici, özellikle miras durumlarında, nesneye yönelik programlama için faydalıdır.
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 ClassAçıklama: ProtectedDemo yöntemi AccessDemo sınıfından ve ondan türeyen herhangi bir sınıftan erişilebilir. Tim, korunmuş belirleyicinin nadir olduğunu ancak mirasla çalışırken çok faydalı olduğunu açıklıyor.
En İyi Uygulama: Türeyen sınıfların belirli yöntem veya özelliklere erişmesine izin vermek istediğinizde, ancak bunların sınıf hiyerarşisi dışında erişilebilir olmasını istemediğinizde korunmuş kullanın.
Özel korunmuş belirleyici, özel ve korunmuş kurallarını birleştirir. Tanımlayan sınıf içinde ve aynı montajdaki türeyen sınıflar içinde yöntemlere veya özelliklere erişimi kısıtlar. Bu, korunmuş'a kıyasla mirasa dayalı erişim kontrolü için daha sıkı bir koruma seviyesi ve daha sıkı bir sınır sunar.
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 ClassAçıklama: PrivateProtectedDemo yöntemi AccessDemo 'dan türediği ve aynı derlemede bulunduğu için DerivedClass içinde erişilebilir. Ancak, UnrelatedClass içinden erişilemez, çünkü bu sınıf AccessDemo 'dan türetilmemiştir.
En İyi Uygulama: Aynı montaj içinde mirasa dayalı erişimi sıkı şekilde kontrol etmeniz gerektiğinde, özel korunmuş erişim belirleyicisini nadir kullanın. Bu, yöntemlerin veya özelliklerin montajlar arasında açılmasının kapsüllemeyi tehlikeye atabileceği senaryolarda özellikle faydalıdır.
Korunmuş dahili belirleyici, korunmuş ve dahili erişim belirleyici seviyelerini birleştirir. Aynı montajdan veya başka bir montajdaki türeyen sınıflardan erişime izin verir.
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 ClassAçıklama: ProtectedInternalDemo yöntemi aynı derleme içinde, ve türetilmiş herhangi bir sınıf tarafından, derleme bağımsız olarak erişilebilir.
En İyi Uygulama: Bir yöntemi, hem türeyen sınıflar (diğer montajlardan) hem de aynı montajdaki sınıflar için açmak istediğinizde, ancak herkese değil, korunmuş dahili kullanın.
Tim Corey, erişim belirleyicilerinin önemini ve her şeyin neden sadece kamuya açık olmaması gerektiğini açıklar. Her şeyi kamuya açık yapmak cazip görünse de, veri ihlalleri, hatalar ve geliştirmede karışıklık gibi önemli riskler getirir. Erişim belirleyicileri, bilgiyi güvence altına almak, istenmeyen kamu erişimini önlemek ve kod tabanlarında açıklık sağlamak için vardır.
Tim, Sosyal Güvenlik Numaraları (SSN'ler) veya kredi kartı numaraları gibi hassas bilgilerin kamuya açık yapılmaması gerektiğini tartışıyor. Veri açığa çıkması durumunun kamuya açık erişim nedeniyle ortaya çıktığı "kötü sınıf" örneğini gösteriyor:
Kötü Örnek:
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 Classİyi Örnek:
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 ClassBaşlangıç: 35:11
Tim, özel yöntemlerin doğrudan erişilemeyeceği davranışları kapsama aldığını açıklar. O, çalışan işten çıkarma gibi daha büyük bir sürecin parçası olarak bir DeleteUser yöntemi örneği kullanıyor.
Kötü Örnek:
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 Classİyi Örnek:
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 ClassErişim belirleyiciler, verilerin uygun doğrulama ile ayarlandığından veya alındığından emin olarak hataları önler. Tim, bir Age özelliği içeren bir örnekle bunu açıklıyor.
Kötü Örnek:
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 Classİyi Örnek:
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 ClassErişim belirleyicilerin doğru kullanımı, sadece gerekli olanı açığa çıkararak karışıklığı önleyerek geliştirmeyi basitleştirir. Örneğin, binlerce yönteme sahip bir uygulamada sadece kamuya açık olanları açığa çıkararak geliştiricilerin yalnızca ilgili seçenekleri görmesini sağlar.
Örnek:
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 ClassGeniş ölçekli projeler için, Tim, erişim belirleyicilerin doğru kullanımının, bir kütüphanenin yalnızca gerekli kısımlarının açığa çıkarılarak geliştiriciler için genel yükü azalttığını açıklar.
Örnek:
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 ClassBu erişim belirleyicilerini doğru kullanarak hem kendi işinizi hem de kodunuzu okuyan bir sonraki kişinin işini kolaylaştırırsınız.
Tim Corey, güvenli, sürdürülebilir ve profesyonel uygulamalar oluşturmak için, C# erişim belirleyicilerinde ustalaşmayı hedefleyen açık ve pratik bir kılavuz sunar. Detaylı açıklamaları ve gerçek dünya örnekleri bu konuyu her seviyeden geliştiriciler için erişilebilir kılıyor.
Daha derin içgörüler edinmek ve bu kavramları eylem halinde görmek için, Tim'in tam videosunu izlediğinizden emin olun ve C# ve diğer programlama konularında değerli içerikler için kanalını inceleyin. Geliştirme becerilerini geliştirmek isteyen herkes için ziyaret edilmesi gereken bir kaynak!
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