C# Sabitler

Sabitler



Şimdi bir sinema bileti programı yazalım. Normal bilet ve öğrenci
bileti için ayrı ayrı fiyat seçenekleri olsun. Program sinemaya
gidince ödeyeceğimiz toplam tutarı bulsun.



using System;



class SinemaBileti

{

static void Main()

{

int TamBilet = 10, OgrenciBileti = 7;



Console.Write("Kaç tane tam bilet: ");

int TamBiletSayisi = Int32.Parse(Console.ReadLine());



Console.Write("Kaç tane öðrenci bileti: ");

int OgrenciBiletiSayisi = Int32.Parse(Console.ReadLine());



int ToplamTutar = TamBiletSayisi * TamBilet +

OgrenciBiletiSayisi * OgrenciBileti;



Console.WriteLine("Toplam tutar (YTL)" + ToplamTutar);

Console.ReadLine();

}

}



Yukarıdaki programda 5 tane değişken var. 2 tanesi ilk değer almış
ve 2 tanesi kullanıcıdan isteniyor ve 1 tanesi de hesaplama sonucu
oluşuyor.



İlk değer ataması yaptığımız 2 değişkene bir de başka açıdan
bakalım.



Bu 2 değişkeni hiç kullanmasak ve programı aşağıdaki gibi
değiştirsek yine aynı işlevi yerine getirir.



using System;



class SinemaBileti

{

static void Main()

{

//int TamBilet = 10, OgrenciBileti = 7;



Console.Write("Kaç tane tam bilet: ");

int TamBiletSayisi = Int32.Parse(Console.ReadLine());



Console.Write("Kaç tane öðrenci bileti: ");

int OgrenciBiletiSayisi = Int32.Parse(Console.ReadLine());



//int ToplamTutar = TamBiletSayisi * TamBilet +

// OgrenciBiletiSayisi * OgrenciBileti;



int ToplamTutar = TamBiletSayisi * 10 + OgrenciBiletiSayisi * 7;

Console.WriteLine("Toplam tutar (YTL)" + ToplamTutar);

Console.ReadLine();

}

}



Aralarında bir fark yok ama bu yeni şekilde 10 ve 7 değerleri
birer sayı ve isimleri yok. Belki yorum satırları eklesek yardımcı
olur. Eğer yorumlar olmazsa bir vakit sonra birisi sizin yazdığınız
koda bakar ve “bu sayılar da ne?” der. Hatta bu kişi siz bile
olabilirsiniz. Yazdığımız kodun okunurluğunu ve anlaşılırlığını
kaybetmesi çok kötü bir durumdur.



Diğer yandan, kullanıcının bilet fiyatlarını kendisinin girmesine
izin de vermek istemiyoruz. Aslında aşağıdaki gibi yapabilirdik.



Console.Write("Tam bilet fiyatýný gir: ");

int TamBilet = Int32.Parse(Console.ReadLine());



Bilet fiyatlarının programın kaynak kodunda bulunmasını
istiyoruz. Pogramın kodlarının içerisine değerleri yazmak en iyi
çözüm değil. Bilet fiyatları değiştikçe kodu açıp değiştirip tekrar
derlememiz lazım. Eğer sadece kendimiz kullanacaksak problem yok.
Ama kodu değiştirip tekrar derledikten sonra yeni programı bütün
kullanıcılara tekrar göndermek, yüklemek büyük problemler.



Kodu yeniden derlemektense, diskte bir dosyada tutmak ve
gerektiğinde yeniden programı derlemeden sadece o dosyayı
değiştirmek güzel bir çözüm. Bu işlerin nasıl yapılabileceğini başka
yazılarda anlatacağız. Şimdilik bu değişkenleri kodun en üstüne
koyalım, program açılır açılmaz değiştirilmesi kolay olsun.



Program kodlarının en üstünde aşağıdaki gibi iki ücret tanımlaması
var.



int TamBilet = 10, OgrenciBileti = 7;



Ama programın sonlarına doğru aşağıdaki gibi bir kod bloğu
gördüğünüz düşünün.



TamBilet = 12;

OgrenciBileti = 9;



Bilet fiyatları değişmiş. Muhtemelen siz değiştirdiniz ama yorum
cümlesi eklemeyi unuttunuz.



Bunun gibi bir programda TamBilet ve OgrenciBileti fiyatlarının
değişken olmaması gerekiyor. Sadece bir tek değere sahip olmaları ve
program boyunca da değiştirilememeleri gerekiyor. Diğer bir
deyişleTamBilet ve OgrenciBileti değişken değil de sabit olmalıdır.



Sabitleri başlarına const yazarak tanımlarız.



const int TamBilet = 10;

const int OgrenciBileti = 7;



Bir tanımlama ifadesinde const kullandıktan sonra artık TamBilet ve
OgrenciBileti için değişken değil de sabit ifadesini kullanmak daha
doğru olacaktır, TamBilet ve OgrenciBileti sabitleri.



Sabitlerin değişkenlerden ne farkı olduğunu inceleyelim. Tanımlama
işlemini yaptıktan sonra değerini değiştirmeye çalıştığınız zaman
derleme hatası ile karşılaşırsınız.



TamBilet = 12;



Eğer programın bir yerlerinde yukarıdaki gibi bir ifade
kullanırsanız C# derleyicisi size aşağıdaki hata mesajını
verecektir.



The left-hand side of an assignment must be a variable, property, or
indexer.



(Bir atama ifadesinin sol tarafında bir değişken, özellik ya da
indeksleyici bulunmalıdır.)



Ve TamBilet yukarıda sayılanlardan hiç birisi değildir. Gerçekte bir
değişken değil, sabittir. Böyle bir derleme hatası aldığınız
durumda, kendinize sormalısınız: “Acaba programın ilerleyen
bölümlerinde değiştirmek isteyeceğim bir şeyi sabit olarak mı
tanımladım?” ya da bu örnekte olduğu gibi “Acaba bir sabit
tanımladım ama programın ilerleyen bölümlerinde yanlışlıkla değerini
mi değiştirmeye çalıştım?” diye.



Bir sabit tanımladığınız zaman ona bir değer ataması da
yapmalısınız.



const int TamBilet; // Derleme hatasý!



Eğer yapmazsanız aşağıdaki hata mesajını görürsünüz.



A const field requires a value to be provided.



(Sabit bir alan için bir değer tanımlamanız gerekiyor.)



Program boyunca değeri değişmeyecek olan bir değişken sabit olmaya
adaydır. Sabit tanımlamak sadece programcının değer değiştirmek
suretiyle hata yapmasını önlemez, aynı zamanda programın
performansını da artırır. Derleyici sabitlerin sakladığı değerleri
stack bölgesinde oluşturmak durumunda kalmaz. Eğer TamBilet ve
OgrenciBileti değerlerini saklamak için sabit tanımlarsanız,
derleyici ToplamTutar değerini ilk yaptığımz örnekte olduğu gibi
değil de ikinci örnekteki gibi hesaplar.



Sabitleri tanımlarken sadece literaller değil ifadeler de
kullanabilirsiniz.



const int TamBilet = 10;

const int OgrenciBileti = 3 * TamBilet / 4;



OgrenciBileti, TamBilet değeri ile yapılan bir takım matematiksel
hesaplamalardan sonra ortaya çıktı. TamBilet değerini değiştirerek
OgrenciBileti değerini de değiştirebilirsiniz. Bu durumda TamBilet,
OgrenciBileti’nden önce tanımlanmış olmalıdır. Yukarıdaki örnekte de
olduğu gibi, bir sabite değer ataması yaparken başka bir sabitin
değeri kullanılabilir ama değişken kullanılmaz.



Yorum Cümleleri adlı yazımızda geçen örneği hatırlarsak eğer,
aşağıdaki gibi bir ifade vardı.



haftalikUcret = 80 * GunSayisi;



Bu örnekteki 80 sayısının ne için orada bulunduğunu kestirmek zor.
Açıklayıcı bir isimle değiştirilse daha iyi olur. Yorum Cümleleri
adlı yazımızda bir değişkenle değiştirmiştik. Fakat sabir kullanmak
daha doğru bir karardır.



const int GunlukUcret = 80;

haftalikUcret = GunlukUcret * GunSayisi;



Sabit kullanmak ifadeyi daha anlaşılır yaptı, ama daha da anlaşılır
yapabiliriz.



Sabit ifadeyi değerini açık hesaplamalar şeklinde yazarak da
tanımlayabiliriz.



const int GunlukUcret = 8 * 10; //Günde 8 saat çalýþýldýðýný
varsaydýk.



Yukarıdaki çarma işlemi derleme esnasında yapıalcağı için programnı
çalışmasında da bir performans kaybı olmayacaktır.



Bir sabitin değeri program derlenirken belli olmak zorundadır.
Meselâ,



const string Prompt = "Adýnýzý giriniz: ";



Promt bir sabit olduğu için başka bir string ifade ataması
yapılamaz. Fakat şu şekilde bir stringi bir sabite atayamazsınız.



const string Response = Console.ReadLine();// Olmaz.



ReadLine çağrısı çalışma esnasında oluşur, derleme esnasında değil.
Derleme esnasında değeri belirli olan bir şeyi ancak bir sabite
atayabilirsiniz.





Hanci.org sizlere daha iyi hizmet sunmak için çerezleri kullanıyor.
Hanci.org sitesini kullanarak çerez politikamızı kabul etmiş olacaksınız.
Detaylı bilgi almak için Gizlilik ve Çerez Politikası metnimizi inceleyebilirsiniz.