[table_of_contents]
Değişkenlere Başlangıç Değeri Verme
Bir değişkene değer vermek için atama operatörü kullanılır. Atama operatörü C#’da ‘=‘ dir. Öyleyse yeni tanımlanmış bir değişkene başlangıç değeri aşağıdaki gibi verilebilir:
int sayac; sayac = 1;
Değişkenin başlangıç değeri aynı zamanda değişken tanımlandığı anda da verilebilir:
int sayac = 1; string isim = "Keskin C";
Eğer aynı satırda birden fazla değişken tanımlanıp başlangıç değerleri de verilmek istenirse aşağıdaki yol takip edilmelidir:
double basariOrani = 88.8, katilimYuzdesi = 52.4;
Değişken Kapsama Alanı (Variable Scope)
Öncelike şu ayrımı yapmak gerekir. Bir metot içerisinde tanımlanmış (Örneğin Main() metodu) değişken lokal değişken (local variable) adını alırken; bir sınıfın ya da bir yapının üyesi olarak tanımlanan değişken alan (field) adını alır. Şu ana kadar ki bütün örnekler Main() metodu içerisinde test edildiği için kullanılan değişkenler lokal değişkenlerdir. Ayrıca daha sonra görülecek döngü ve kontrol deyimleri, özellik
(property),indeksleyici (indexer) gibi sınıf ya da yapı üyelerinin içerisinde tanımlanan değişkenler de lokal değişkenlerdir. Lokal değişkenlerin tanımlanmaları ile birlikte belleğin stack bölgesine yerleştiğini artık biliyoruz. Peki, bu değişkenler ne kadar süre orada kalıyorlar. Acaba uygulama kapanana kadar mı? Yoksa bizim ihtiyacımız kalmayıncaya kadar mı? Aslında ikisi de değil.
Lokal değişkenler, tanımlandıkları süslü parantezler arasında erişilebilirdirler. Evet, kulağa ilginç geliyor ama tam açıklaması böyle. Bu değişkenler tanımlandıkları bloğa özeldirler ve programda kontrol, bu bloğun sonuna geldiğinde blok içerisinde belleğe çıkarılmış olan bütün lokal değişkenler otomatik olarak bellekten düşer. Özetlemek gerekirse lokal değişkenler sadece tanımlandıkları blok içerisinde kullanılabilirler.
Blok içinde kullanım
...
{
int a = 5; //a değişkeni bellekte yerini alır.
} // a değişkeni, bellekten düşer.
Console.WriteLine(a); //Dizayn-zamanı hatası !!!
...
Yukarıdaki kod bloğunda a değişkeni tanımlanıp başlangıç değeri verilir ve blok sonuna kadar kullanılır. Tanımlandığı blok sonunda ise bellekten otomatik olarak düşer; sonrasında a değişkeni kapsama alanı dışında kaldığı için, kullanılmaya çalışıldığında henüz dizayn zamanında buna izin verilmez. Burada yalnız başına kullanılan blok, anlamsız gibi gözükse de aslında lokal değişkenlerin, içinde kullanılabileceği metot ya da daha sonra öğrenilecek deyimler ve diğer üyeleri temsil
etmektedir.
...
{
int b; //b değişkeni belleğe çıkar.
b = 23;
} //b değişkeni bellekten düşer.
{
int b; //b adında bir değişken belleğe yeniden çıkarılır.
b = 1;
} //Yeni b değişkeni bellekten düşer.
...
Yukarıdaki kod bloğunda yapılanlar tamamen legaldir. Burada birbirinden bağımsız iki tane blok yer almaktadır. İlk blok içerisinde bellekte 4 byte’lık bir yer ayrılır ve buraya 23 değeri atılarak blok içerisinde kullanılır. Blok sonuna gelinince bellekteki 4 byte’lık alan tamamen silinir; dolayısıyla hem bellek içerisinde saklanan değer hem de bellek alanına erişmek için verilen isim (değişken adı b) yok edilmiş olur. Artık
uygulamanın ilerleyen satırlarında yer alacak yeni bir kod bloğunda ‘b’ değişken isminin kullanılmaması için herhangi bir sebep yoktur.
…
{
int b;
b = 23;
{
int b; //Derleme-zamanı hatası.
}
}
…
Bu blokta önce ‘b’ isimli değişken bellekte yerini alır ve başlangıç değeri verilir. Ardından b değişkeninin kapsama alanında bulunduğu bloğun içerisinde yeni bir blok açılır ve burada belleğe yeniden ‘b’ adında bir değişken çıkarılmaya çalışılır. Ancak bellek bölgesinde aynı anda aynı isimli iki değişkenin yer almasına izin verilmez; çünkü değişken değerlerine erişim, bellek bölgelerine verilen değişken isimleri ile
sağlanır ve eğer aynı isimli birden fazla değişkene izin verilseydi işler karışırdı. Dolayısıyla yeni bir değişken ihtiyacı varsa ‘b’ değil de farklı isimde bir değişken adıyla bu sağlanabilir:
...
{
int b;
b = 23;
{
int c; //Sorun yok.
c = 23;
}
}
...
İçerdeki blokta b değişkeni hala erişilebilir olduğu için aynı isimli bir değişken tanımlanamamasına rağmen bu blokta ‘b’ değişkeninden faydalanılabilir:
...
{
int b;
b = 23;
{
Console.WriteLine(b); //Geçerli bir kullanım. } } ...
Şimdi de değişken kapsama alanı kombinasyonları için son örneği inceleyelim:
...
{
{
int b;
b = 23;
}
int b = 42; //Derleme zamanı hatası !!!
}
...
Burada içerdeki blokta tanımlanan ‘b’ değişkeni aynı zamanda dışardaki bloğun da kapsama alanındadır. O yüzden içerdeki bloğun sonuna gelindiğinde ‘b’ hala bellektedir; dolayısıyla aynı isimli değişken oluşturulmasına izin verilmeyeceği için derleme zamanında bununla ilgili hata alınır. Ayrıca beklenilenin aksine içerdeki bloktan çıkıp ‘b’ kullanılmak istendiğinde de kullanılamayacaktır.
degısken-csharp-visual-studi
İçerdeki blokta tanımlan bir değişkene blok sonunda, dışarıdaki bloğun kapsama alanı dahilinde olsa da erişilemez. ‘b’ değişkeni yukarıda görüldüğü gibi içerdeki blokta kullanılıp bloğun dışarısında erişilmeye çalışıldığı zaman erişilemez; bunun sebebi ‘b’ aslında halen bellekte olmasına rağmen tanımlandığı içsel bloğun dışında
erişilip yönetilememesidir.(debug edilerek bu görülebilir –‘b’ değişkeninin ilk tanımlandığı satıra bir kesme işareti <breakpoint> koyup uygulama F5 ile çalıştırılır ve ardından F11 ile satır satır ilerlenerek Locals penceresinden <Menülerden Debug->Windows->Locals ile açılabilir> – değişkenin durumu daha sağlıklı bir
şekilde gözlemlenebilir. Ya da kesme işareti koymak yerine uygulama doğrudan F11 ile başlatılarak da aynı işlemler yapılabilir)
Console.WriteLine(b); //Geçerli bir kullanım.
}
}
…
Şimdi de değişken kapsama alanı kombinasyonları için son örneği inceleyelim:
…
{
{
int b;
b = 23;
}
int b = 42; //Derleme zamanı hatası !!!
}
…
Burada içerdeki blokta tanımlanan ‘b’ değişkeni aynı zamanda dışardaki bloğun da kapsama
alanındadır. O yüzden içerdeki bloğun sonuna gelindiğinde ‘b’ hala bellektedir; dolayısıyla aynı isimli değişken
oluşturulmasına izin verilmeyeceği için derleme zamanında bununla ilgili hata alınır.
Ayrıca beklenilenin aksine içerdeki bloktan çıkıp ‘b’ kullanılmak istendiğinde de kullanılamayacaktır.
Konular: alan, atama, block, c sharp, c#, çalış, çözüm, csc, csharp, değer, değişken, derleme, global, hatal, ipucu, kapsama, kaynak, kod, local, namespace, örnek, rehber, variable, veri
Yorum yok
Bu yazı için Yorum Beslemesi
Geri izleme bağlantısı http://www.kodhane.com/csharp-degisken-kapsam-alan-blok.html/trackback