Şöyle bir program yazdığımızı düşünelim;
Evimize gelen her misafirin üç kurabiye yiyeceğini varsayan ve buna göre misafirlere yetecek kurabiye sayısını hesaplayan bir program. Bu program aşağıdaki gibi bir kod içerebilir.
if (KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
Bu kodu inceledikten sonra DahaFazlaKurabiyeYap metodunun tam olarak ne yaptığını merak edebiliriz. Otomatik olarak misafir sayısına göre kurabiye yapıyor olabilir.
Ama eğer ya hiç misafir gelmesse? O zaman MisafirSayisi değişkenimiz 0 olcak ve bizde sıfıra bölüm hatası alacağız. Bununla beraber eğer hiç misafirimiz gelmesse bloğun içindeki kodun işletilmesini de istemeyiz. İlk yaklaşımımız şu olabilir; if ifadesi içindeki MisafirSayisi değişkenini kontrol ettirebiliriz.
if (MisafirSayisi > 0 & KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
Amacımıza biraz yaklaştık. MisafirSayisi değişkenimizin değeri sıfır olsa bile bölümün hala gerçeleştirileceğine dikkat edin. Ve sıfıra bölüm harasının meydana gelecek. Eğer MisafirSayisi değişkeni sıfır ise bölümü engellemek için ne yapmalıyız? Bir diğer yaklaşımda Boolean ifadeyi iç içe geçmiş iki parçaya ayırmak olabilir.
if (MisafirSayisi > 0)
{
if (KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
}
Bu işe yarayacaktır. Birinci if ifadesinde MisafirSayısı sıfıra eşitse ikinci if ifadesi işletilmeyecektir.
Bir diğer yaklaşım ise Durumsal VE operatörü kullanmaktır. Bu operatör bu gibi durumlarda kullanılmak üzere dizayn edildi. Normal VE operatörünün bir tane “&” işaretinden oluştuğunu biliyoruz. Durumsal VE operatörü ise “&&” ’dir.
if (MisafirSayisi > 0 && KurabiyeSayisi / MisafirSayisi < 3)
{
DahaFazlaKurabiyeYap();
}
Operatörün sağındaki kısım solundaki kısımdan True ifadesi dönmedikçe işletilmeyecektir. Bunun dışında Durumsal VE operatörü normal VE operatörüne benzer. MisafirSayısı değişkeninin sıfır olduğunu düşünelim. MisafirSayisi>0 ifadesinden False değeri dönecektir. False değerinden sonra gelen operatör Durumsal VE operatörü olduğu için operatörün sağındaki kısım her ne olursa olsun asla işletilemeyecektir. Bütün Boolean ifdenin sonucu asla True olmayacaktır. Operandın sağındaki ifadelerin işletilmesine gerek yoktur. Eğer MisafirSayisi 0 ise Bölüm asla gerçekleşmeyecektir.
Şimdi normal VE operatörünü inceleyelim
BooleanIfade1 & BooleanIfade2
Burada ifadelerinin ikisininde herzaman işletileceği unutulmamalıdır.
BooleanIfade1 && BooleanIfade2
Bu kodda ise BooleanIfade1’den false değeri dönerse BooleanIfade2 asla işletilmeyecektir.
Durumsal VE ye benzer olarak Durumsal VEYA iki dik çizgiden oluşur. (||)
if (MisafirSayisi > 0 || KurabiyeSayisi / MisafirSayisi < 3)
{
KurabiyeYapma();
}
Bu kod bloğuda içinden aynı mantığı döndürür. Eğer hiç misafir yoksa veya misafir başına en az 3 kurabiye varsa kurabiye yapılmamalıdır. Eğer Durumsal VEYA operatörünün solundaki ifade true değeri döndürüyorsa sağındaki ifadeye bakmaya gerekyoktur. Çünkü herşeye rağmen bütün ifade true olacaktir.
if ( BooleanIfade1 || BooleanIfade2 )
{
//Kodlar
}
Üsteki kodda BooleanIfade1 true ise BooleanIfade2’den ne döndüğüne bakılmaksızın Kodlar kısmı işletilecektir. BooleanIfade1 false, ve BooleanIfade2 true ise yine kodların işletileceğine dikklat edelim.
C ve C++ dilinden gelen birçok C# programcısı gereksiz kodların işletilmesini engellemek için normal VE ve normal VEYA durumsal operatörleri yerine Durumsal VE ve Durumsal VEYA operatörlerini kullanmaya meyillidirler. Şimdi artık yıl hesabı yapan bir kod parçasını durumsal operatörlerle yazalım. Boolean bir AtikYil değişkenimiz olsun. True için artık yıl olduğunu False için olmadığını temsil edecek. Birde integer bir Yil değişkenimiz olsun. Şimdi kodumuzu yazalım.
ArtikYil = Yil % 4 == 0 && ( Yil % 100 != 0 || Yil % 400 == 0 );
Eğer Yil değişkeni 4’e bölünemiyorsa asla artık yıl olamaz. Ve && operatörünün sağındaki kısım asla işletilmez.
C# C’den kalan adına “Durumsal Operatör” denilen gerip bir mirası da destekler. Tek bir operandı bulunan tekli operatörleri, iki operatörü bulunun çiftli opertörleri biliyoruz. C’deki bu “Durumsal Operatör” C#’daki tek üçlü operatördür. Üç operand bir soru işareti (?) ve ikinokta üstüste (:) operatörleri ile ayrılır. Ve ifade aşağıdaki gibi olur
BooleanIfade ? A : B ;
A ve B aynı tipte ifadeler olmalıdır ( yada birbirine çevililebilen ). BooleanIfade değişkeni true ise yukarıdaki ifadenin sonucu A, eğer BooleanIfade değişkeni false ise yukarıdaki ifadenin sonucu B’dir. Bir örnekle açıklayalım. ArtikYil diye bir boolean değişkenimiz olsun.
ArtikYil ? 29 : 28;
Eğer ArtikYil değilkeni true ise bu ifadenin sonucu 29, eğer ArtilYil değişkenin değeri false ise yukarıdaki ifadenin sonucu 28’dir. Şöyle düşünelim. Artık yıllarda Şubat ayında 29 gün vardır. Diğer yıllarda ise 28 gün vardır. Eğer içinde bulunduğumuz yıl artıl yıl ise (ArtikYil=true) Şubat ayı 29 gündür. Eğer içinde bulunduğumuz yıl artık yıl değilse (ArtikYil=false) Şubat ayı 28 gündür. Yukarıda yazdığımız ifadeyi bir atama işleminde de kullanabilir. SubatGunSayisi diye bir integer değerimiz olsun.
SubatGunSayisi = ArtikYil ? 29 : 28;
Burada eğer artık yılda isek SubatGunSayisi değişkenine 29, değilsek 28 değeri atanıyor. Yukarıda anlatılanları bu örnekte daha kolay anlıyor.
Durumsal operatörler alternatiflerine göre oldukça rahatlık sağlıyor
if ( ArtikYil )
SubatGunSayisi = 29;
else
SubatGunSayisi = 28;
Boolean değişkenler yerine boolean ifadeler de kullanılabilir.
Bonus = Satis >= 1000 ? 100 : 50;
Bu ifadede yapılan satıs 1000 YTL den büyükse 100 YTL bonus, eğer satış 1000 YTL’den az ise 50 YTL bonus verileceği gösteriliyor.
Durumsal operatörler atama operatörleri hariç geri kalan operatörlerden daha düsük önceliğe sahiptirler. Yukarıdaki operatörler içinde en yüksek önceliğe sahip olan Satis >= 1000 ifadesidir. Fakat yinede kendimiz daha rahat hissetmek için Durumsal operatörleri parantez içine almak isteyebiliriz.
Bonus = (Satis >= 1000 ? 100 : 50);
Veya iki parantez de kullanabiliriz.
Bonus = ((Satis >= 1000) ? 100 : 50);
Durumsal operatörler kesinlikle koddan kazanmayı sağlarlar. Bu kolayca suistimal edilebilir. Özellikle de iç içe geçmiş durumsal operatörler kullanıldığında. Kaçıncı ayda olduğumuza göre içinde bulunduğumuz ayın gün sayısını döndüren aşağıdaki ifade buna örnektir. Kaçıncı ayda olduğumuzu tutan integer bir iAy değişkeni, Gun sayisini tutan integer bir iGunSayisi değişkeni, Artık yılda oluğ olmadığımızı gösteren boolean bir bArtikYil değiskeni tanımladığımızı varsayalım.
GunSayisi = Ay == 4 || Ay == 6 || Ay == 9 Ay == 11 ? 30 :
Ay != 2 ? 31 : ArtikYil ? 29 : 28 ;
Yukarıdaki kodu gerçekten okumak çok zor. Bu gibi kullanımlardan kaçınmalıyız. Bu daha sonra kodumuzu okumaya çalıştığımızda yada başkaları okumaya çalıştığında başımızı ağrıtabilir.