Access Modifier’lar (erişim belirleyiciler) bir varlığın (sınıf, metod, değişken, interface vb.) erişilebilirliğini belirtmek için kullanılan keywordlerdir. Çalıştığımız bir projede güvenlik vb. gerekçelerle bazı varlıklara her yerden erişilememesini veya tam tersi kolayca erişilebilmesini isteyebiliriz. Bu gibi durumlarda yardımımıza koşarlar.
Kullandığımız tasarıma göre en doğru access modifier seçimi yapmak proje büyüdükçe oluşabilecek çakışmalardan bizi koruyacak, kodumuzu daha tutarlı ve güvenli hale getirecektir.
C#’ta kapsamı en kısıtlayıcı olandan en genişine doğru “private, protected, protected internal, internal ve public” olmak üzere 5 çeşit access modifier bulunur.
Private
En katı şekilde kısıtlayıcı access modifier’dır. Belirttiği varlığı yalnızca yer aldığı kod bloğu içerisinde erişilebilir hale getirir. Blok dışından erişilemez.
Detay: Bir sınıf içerisindeki üyelerin, özellikle belirtilmediği sürece default access modifierları private‘tır.
1 2 3 4 5 6 | public class Islem { int sonuc; //.... } |
Örneğin yukarıda Islem sınıfının içinde tanımlanan integer tipindeki sonuc değişkeni default olarak private kabul edilir ve sınıf sonlandığında erişilebilirliğini yitirecektir.
Protected
Protected tanımlanan varlık tanımlandığı sınıfın içerisinde erişilebilirdir. Bu yönüyle private’a benzese de aralarındaki fark protected tanımlanan varlıklar o sınıftan türetilmiş sınıflar içerisinden de erişilebilir hale gelmektedir.
Protected Internal
İlk kez duyanlar için sonrasında hatırlaması nedense zor gelen ancak adından gayet kolay çıkarımda bulunabilecek bir access modifier’dır. Tanımlandığı öğenin erişilebilirliğini protected ve internal erişim belirleyicilerinin OR (VEYA) işlemine tabi tutulmasıyla belirler. Yani daha da açıklayıcı olmak gerekirse, protected internal tanımlanan bir öğeye tıpkı protected tanımlanmış gibi tanımlandığı sınıfın içerisinden ve o sınıftan türetilmiş sınıflardan erişilebilir. Bu kısım protected access modifierından gelmektedir. Internal ile OR işlemine tabi tuttuğumuz için ek olarak, aynı assembly içerisinde olmasalar dahi tanımlandığı sınıftan türetilmiş diğer sınıflar içerisinden de erişilebilir.
Internal
Internal olarak tanımlanan bir öğeye bulunduğu assembly (exe veya dll dosyası) içerisinde her yerden erişilebilir.
Detay: Bir sınıfın özellikle belirtilmediği sürece default access modifier’ı internal‘dır.
Public
Public olarak tanımlanan bir öğeye her yerden erişilebilir. Sınıf içerisinden veya sınıf dışından hatta farklı bir assembly (exe veya dll dosyası) üzerinden de referans olarak belirtildiğinde o öğe erişilebilir hale gelecektir.
Access Modifier’lara Dair Ek Birkaç Ufak Detay
- Class veya Struct’lar public veya internal tanımlanabilirler. Struct’lar inheritance’ı desteklemediği için protected ve protected internal tanımlanamazlar.
Son olarak her şeyi bir tablo halinde görmek çok daha verimli olacaktır.
Access Modıfıer | Aynı Assembly İçinden | Farklı Assembly’ler İçinden | |||
Tanımlandığı Sınıftan | Diğer Sınıflardan | Türetilmiş Sınıflardan | Diğer Sınıflardan | Türetilmiş Sınıflardan | |
Private | Erişilebilir | Erişilemez | Erişilemez | Erişilemez | Erişilemez |
Public | Erişilebilir | Erişilebilir | Erişilebilir | Erişilebilir | Erişilebilir |
Protected | Erişilebilir | Erişilemez | Erişilebilir | Erişilemez | Erişilebilir |
Internal | Erişilebilir | Erişilebilir | Erişilebilir | Erişilemez | Erişilemez |
Protected Internal | Erişilebilir | Erişilebilir | Erişilebilir | Erişilemez | Erişilebilir |