C# Erişim Denetleyicileri (Access Modifiers)
Sınıf üyelerini kontrol altına almak için gerekli denetleyicilerAmacım C# ın anahtar konularını sözlükten daha detaylı ama ders notundan daha kısa bir şekilde ele almak ve başlangıç için bir temel oluşturmak. Bu yazı sonunda kavramların ne olduğunu, genel olarak nasıl kullanıldıklarını ve ne amaçla kullanılabilecekleri hakkında bilgi sahibi olacaksınız.
Erişim denetleyicileri (Access Modifiers) program içerisinde tanımlanan değişkenlere nasıl ulaşılabileceğini belirtir. Erişim denetleyicilerini bir değişken, sınıf ya da yöntem deklere ederken mutlaka kullanırız. Kullanım şekli şu şekildedir.
erişim_denetleyicisi değişken_tipi değişken_adı=değişken_değeri;
private int iSayi=10;
Yöntemler için
erişim_denetleyicisi dönüş_tipi yöntem_adı (parametreler);
public int id_al (string hasta_Adi);
Private
Private üyelere sadece kendi sınıfının diğer üyeleri tarafından erişilebilir. Private erişim denetleyicileri varsayılan denetleyici tipidir.
int i=10;
şeklinde bir değişken tanımladığımızda i private bir değişken olur.
Public
Bir üye public olarak tanımlandığında, kod içerisinde herhangi bir yerden erişilebilir durumdadır.
Program içerisinde en yaygın olarak kullanılabilecek erişim denetleyicileri public ve private dır. Bunun nedeni de özel amaçları olmamasıdır. Kesin olmamakla birlikte eğer bir değişken sadece bulunduğu sınıfı ilgilendiriyorsa ya da değişkenin yanlış kullanımı hataya yol açabilecekse private olarak deklere edilmelidir. Böylece kodun geri kalanı tarafından erişilemez ve karışıklıklar ya da hatalar ortadan kalkar. Bu değişkenlere kod içerisinden erişmek gerekirse, bu public olarak deklere edilmiş yöntemlerle yapılabilir. Böylece değişkene atanabilecek değerler de kontrol altına alınmış olur.
Internal
Internal erişim denetleyicisi birden fazla uygulamanız olduğunda oldukça yararlıdır. Internal olarak tanımlanmış bir üye, aynı assembly içerisindeki tüm dosyalar tarafından bilinir ama farklı assembly içerisindeki dosyalar tarafından erişlemez. Diğer bir deyişle, internal üyeyi aynı program içerisinde kullanabilirsiniz ama bu üyeye farklı bir program içerisinden erişemezsiniz. Bir DLL hazırladınız. Bu DLL içerisinde bir değişkeni internal olarak tanımladığınızda, istediğiniz kadar sınıf ekleyin, bu sınıfların hepsi tarafından kullanılabilir. Ama bu DLL i başka bir uygulama içerisinde kullanırsanız, DLL içerisinde internal olarak tanımlanan üyeleri, diğer uygulama içerisinden göremezsiniz.
Protected
Protected üyeler, public ve private üyelerin bir birleşimi gibidir. Bir sınıf içerisinde üyeyi protected olarak tanımladığınızda, bu sınıftan türetilen sınıflar aynı üyeye erişebilir. Bu açıdan public üyelere benzer. Ama bu sınıftan türetilmeyen başka bir sınıf protected üyeye erişemez. Bu yönden de private üye gibi davranır.
Static
Static üyeler mucize gibi her derde devadır. Static üyeleri diğerlerinden ayıran fark, bu üyelere erişmek için sınıfın örneklenmesinin gerekmemesidir. Doğrudan
sınıf_adi.static_üye_adi;
şeklinde erişilebilir.
Hem yöntemler hem de değişkenler static olarak tanımlanabilir. En güzel örnek Main() yöntemidir. Main() yöntemi CLR tarafından uygulamaya giriş noktası olarak kullanıldığından, uygulama çalışmadan önce, yani sınıf örneklenmeden önce(C# da her şey sınıftır.. ) bu noktaya erişilmesi gerekir. Bu yüzden de Main() yöntemi her zaman static olmalıdır.
static olarak tanımlanan üyeler, sınıftan nesneler türetildikçe tekrar tekrar türetilmezler. Bir sınıftan on tane nesne türetsek bile bu on nesne aynı static üyeyi kullanır.
using System;
class Sinif
{
static public int Sayi=0; // static değişkenimiz
public Sinif()
{
Sayi++;
}
}
class Uygulama
{
[STAThread]
static **** Main(string[] args)
{
for (int i=0;i<=4;i++)
{
Sinif s=new Sinif();
Console.WriteLine("Sinif.Sayi : "+Sinif.Sayi);
}
}
}
Bu örneğin çıktısı
Sinif.Sayi : 1
Sinif.Sayi : 2
Sinif.Sayi : 3
Sinif.Sayi : 4
Sinif.Sayi : 5
şeklindedir. Gördüğünüz gibi tek yapılan aynı sınıftan farklı sayıda nesne türetmek. Static değişkenlere ilk değeri vermezseniz değişkenin tipine göre varsayılan değeri alırlar. İnt için 0, bool için false, object için null, string için “” (boş dize) gibi…
static örnekte de görüldüğü gibi mutlaka private, public, protected ve internal erişim denetleyicileriyle birlikte kullanılmalıdır.
Yapılandırıcılar da static olarak tanımlanabilir. Bu şekilde nesneden herhangi bir sınıf örneklemeden o nesnenin bir özelliğine değer atanabilir.
Const
Program içerisinde değeri kod tarafından kesinlikle değiştirilemeyecek değişkenler için kullanılır. Bu değişkenlere ilk değerleri, değişken deklere edilirken verilmelidir.
const string EnBuyuk=”Beşiktaş”;
EnBuyuk programın geri kalanında sadece Beşiktaş değerini kullanabilir. Değeri kesinlikle çalışma zamanında değişmez.
Readonly
Readonly değişkenler const değişkenlere benzer. Tek farkı ilk değerlerinin çalışma zamanında atanabilir olmasıdır. Sınıf yapılandırıcısında çalışma zamanında elde edilen değer readonly bir değişkene aktarılır ve bu değişken programın geri kalanında değiştirilmeden kullanılabilir.
İyi çalışmalar
Sınıf üyelerini kontrol altına almak için gerekli denetleyicilerAmacım C# ın anahtar konularını sözlükten daha detaylı ama ders notundan daha kısa bir şekilde ele almak ve başlangıç için bir temel oluşturmak. Bu yazı sonunda kavramların ne olduğunu, genel olarak nasıl kullanıldıklarını ve ne amaçla kullanılabilecekleri hakkında bilgi sahibi olacaksınız.
Erişim denetleyicileri (Access Modifiers) program içerisinde tanımlanan değişkenlere nasıl ulaşılabileceğini belirtir. Erişim denetleyicilerini bir değişken, sınıf ya da yöntem deklere ederken mutlaka kullanırız. Kullanım şekli şu şekildedir.
erişim_denetleyicisi değişken_tipi değişken_adı=değişken_değeri;
private int iSayi=10;
Yöntemler için
erişim_denetleyicisi dönüş_tipi yöntem_adı (parametreler);
public int id_al (string hasta_Adi);
Private
Private üyelere sadece kendi sınıfının diğer üyeleri tarafından erişilebilir. Private erişim denetleyicileri varsayılan denetleyici tipidir.
int i=10;
şeklinde bir değişken tanımladığımızda i private bir değişken olur.
Public
Bir üye public olarak tanımlandığında, kod içerisinde herhangi bir yerden erişilebilir durumdadır.
Program içerisinde en yaygın olarak kullanılabilecek erişim denetleyicileri public ve private dır. Bunun nedeni de özel amaçları olmamasıdır. Kesin olmamakla birlikte eğer bir değişken sadece bulunduğu sınıfı ilgilendiriyorsa ya da değişkenin yanlış kullanımı hataya yol açabilecekse private olarak deklere edilmelidir. Böylece kodun geri kalanı tarafından erişilemez ve karışıklıklar ya da hatalar ortadan kalkar. Bu değişkenlere kod içerisinden erişmek gerekirse, bu public olarak deklere edilmiş yöntemlerle yapılabilir. Böylece değişkene atanabilecek değerler de kontrol altına alınmış olur.
Internal
Internal erişim denetleyicisi birden fazla uygulamanız olduğunda oldukça yararlıdır. Internal olarak tanımlanmış bir üye, aynı assembly içerisindeki tüm dosyalar tarafından bilinir ama farklı assembly içerisindeki dosyalar tarafından erişlemez. Diğer bir deyişle, internal üyeyi aynı program içerisinde kullanabilirsiniz ama bu üyeye farklı bir program içerisinden erişemezsiniz. Bir DLL hazırladınız. Bu DLL içerisinde bir değişkeni internal olarak tanımladığınızda, istediğiniz kadar sınıf ekleyin, bu sınıfların hepsi tarafından kullanılabilir. Ama bu DLL i başka bir uygulama içerisinde kullanırsanız, DLL içerisinde internal olarak tanımlanan üyeleri, diğer uygulama içerisinden göremezsiniz.
Protected
Protected üyeler, public ve private üyelerin bir birleşimi gibidir. Bir sınıf içerisinde üyeyi protected olarak tanımladığınızda, bu sınıftan türetilen sınıflar aynı üyeye erişebilir. Bu açıdan public üyelere benzer. Ama bu sınıftan türetilmeyen başka bir sınıf protected üyeye erişemez. Bu yönden de private üye gibi davranır.
Static
Static üyeler mucize gibi her derde devadır. Static üyeleri diğerlerinden ayıran fark, bu üyelere erişmek için sınıfın örneklenmesinin gerekmemesidir. Doğrudan
sınıf_adi.static_üye_adi;
şeklinde erişilebilir.
Hem yöntemler hem de değişkenler static olarak tanımlanabilir. En güzel örnek Main() yöntemidir. Main() yöntemi CLR tarafından uygulamaya giriş noktası olarak kullanıldığından, uygulama çalışmadan önce, yani sınıf örneklenmeden önce(C# da her şey sınıftır.. ) bu noktaya erişilmesi gerekir. Bu yüzden de Main() yöntemi her zaman static olmalıdır.
static olarak tanımlanan üyeler, sınıftan nesneler türetildikçe tekrar tekrar türetilmezler. Bir sınıftan on tane nesne türetsek bile bu on nesne aynı static üyeyi kullanır.
using System;
class Sinif
{
static public int Sayi=0; // static değişkenimiz
public Sinif()
{
Sayi++;
}
}
class Uygulama
{
[STAThread]
static **** Main(string[] args)
{
for (int i=0;i<=4;i++)
{
Sinif s=new Sinif();
Console.WriteLine("Sinif.Sayi : "+Sinif.Sayi);
}
}
}
Bu örneğin çıktısı
Sinif.Sayi : 1
Sinif.Sayi : 2
Sinif.Sayi : 3
Sinif.Sayi : 4
Sinif.Sayi : 5
şeklindedir. Gördüğünüz gibi tek yapılan aynı sınıftan farklı sayıda nesne türetmek. Static değişkenlere ilk değeri vermezseniz değişkenin tipine göre varsayılan değeri alırlar. İnt için 0, bool için false, object için null, string için “” (boş dize) gibi…
static örnekte de görüldüğü gibi mutlaka private, public, protected ve internal erişim denetleyicileriyle birlikte kullanılmalıdır.
Yapılandırıcılar da static olarak tanımlanabilir. Bu şekilde nesneden herhangi bir sınıf örneklemeden o nesnenin bir özelliğine değer atanabilir.
Const
Program içerisinde değeri kod tarafından kesinlikle değiştirilemeyecek değişkenler için kullanılır. Bu değişkenlere ilk değerleri, değişken deklere edilirken verilmelidir.
const string EnBuyuk=”Beşiktaş”;
EnBuyuk programın geri kalanında sadece Beşiktaş değerini kullanabilir. Değeri kesinlikle çalışma zamanında değişmez.
Readonly
Readonly değişkenler const değişkenlere benzer. Tek farkı ilk değerlerinin çalışma zamanında atanabilir olmasıdır. Sınıf yapılandırıcısında çalışma zamanında elde edilen değer readonly bir değişkene aktarılır ve bu değişken programın geri kalanında değiştirilmeden kullanılabilir.
İyi çalışmalar
