C# Erişim Belirtecilerini Anlamak
[[academy-video-youtube({"vid": "jcn5uCZAk2w", "start_time": "0", "title": "C# Erişim Belirleyicilerini Anlamak", "creator": "Tim Corey", "length": "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.
Erişim Belirleyicileri Nedir?
Giriş
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.
Demo Uygulama Açıklaması
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.
Proje Yapısı:
- Konsol UI: Erişim belirleyicilerini test etmek için bir konsol uygulaması.
- Demo Kütüphane: Çeşitli erişim belirleyicilerinin gösterildiği bir sınıf kütüphanesi.
public class AccessDemo
{
private void PrivateDemo() { }
internal void InternalDemo() { }
public void PublicDemo() { }
}public class AccessDemo
{
private void PrivateDemo() { }
internal void InternalDemo() { }
public void PublicDemo() { }
}1. Özel
Nedir:
Özel belirleyici, erişimi sadece tanımlandığı sınıf içinde yönteme, alana veya özelliğe kısıtlar.
Kod Örneği:
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 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
}
}Açı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.
2. Dahili
Nedir:
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.
Kod Örneği:
public class AccessDemo
{
internal void InternalDemo()
{
Console.WriteLine("Internal method is accessible within the same assembly.");
}
}public class AccessDemo
{
internal void InternalDemo()
{
Console.WriteLine("Internal method is accessible within the same assembly.");
}
}Açı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.
3. Açık
Nedir:
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.
Kod Örneği:
public class AccessDemo
{
public void PublicDemo()
{
Console.WriteLine("Public method can be accessed from any class.");
}
}public class AccessDemo
{
public void PublicDemo()
{
Console.WriteLine("Public method can be accessed from any class.");
}
}Açı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.
4. Korunmuş
Nedir:
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.
Kod Örneği:
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 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
}
}Açı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.
5. Özel Korunmuş
Nedir:
Ö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.
Kod Örneği:
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 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
}
}Açı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.
6. Korunmuş Dahili
Nedir:
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.
Kod Örneği:
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 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
}
}Açı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.
Her Şeyi Neden Kamuya Açık Yapmıyorsunuz?
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.
1. Özel Bilgileri Korumak
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 string SSN; // Anyone can access and modify it directly
}İ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 string ssn;
public string GetMaskedSSN()
{
return "XXX-XX-" + ssn.Substring(ssn.Length - 4);
}
public void SetSSN(string value)
{
// Add validation if needed
ssn = value;
}
}2. Özel Yöntemleri Güvence Altına Alma
Baş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 void DeleteUser(int userId)
{
// Deletes the user without considering related processes
}
}İ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 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
}
}3. Hataları Önleme
Eriş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 int Age; // Can be directly set to an invalid value
}İ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 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;
}
}
}4. Karışıklığı Azaltma ve Açıklığı Artırma
Eriş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 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
}
}5. Daha Büyük Uygulamalarda veya Kütüphanelerde Faydaları
Geniş ö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 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
}
}Bu 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.
Sonuç
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!

