Uzun bir aradan sonra tekrar merhabalar. Yine makale yazmayalı uzun zaman oldu. Aslında o zaman zarfında neler yaptığımı içeren bir yazı daha yazmam gerekecek; ancak öncelik C# dersinde. 4. ders olarak akış kontrol mekanizmalarını anlatmaya çalışacağım.
DERS 4 : Akış Kontrol Mekanizmaları
Akış kontrol mekanizmaları başlığı altında, aslında iki ayrı tipteki mekanizmaları inceleyeceğiz. Bunlardan bir tanesi eğer … ise … yap anlamına gelen if – else ve switch – case mekanizmaları, diğeri ise belirli işi farklı inputlarla yapmamıza izin veren for, while, foreach gibi döngü mekanizmaları.
If – else yapısı bir programın olmazsa olmaz kontrol mekanizmalarından birisidir. Küçük veya büyük olsun, bir program yazıyorsanız if – else mekanizmasını %99 ihtimalle kullanacaksınız demektir. Gelelim şimdi bu yapının nasıl çalıştığına. If – else yapısının söz dizimi aşağıdaki gibidir:
if (koşul)
{
//koşul doğru olduğunda yapılacak işlemler
}
else
{
//koşul yanlış olduğunda yapılacak işlemler
}
Temel olarak yapı bu kadar basit. Koşul yazdığım yere sonucu true veya false olan herhangi bir ifade yazmanız gerekiyor. Gerçek bir örnek vermek gerekirse:
int a = 3;
int b = 4;
if (a > b)
{
Console.WriteLine("a sayısı b sayısından büyüktür.");
}
else
{
Console.WriteLine("a sayısı b sayısından küçük veya eşittir.");
}
Yukarıdaki kod bloğunda, a ve b değişkenlerini tanımlayıp değer atadık. if içerisinde, bir önceki derste görmüş olduğumuz karşılaştırma operatörü olan > işaretini kullanarak a büyüktür b yazdık. Çalışma zamanında bu ifadenin doğru olup olmadığı kontrol edilecek ve eğer doğruysa hemen altından çalışmaya devam edecek. Süslü parantezin içerisindeki kodların işletimi bittiğinde else ifadesinin süslü parantezleri içerisinde kalan kısmı atlanacak ve programa devam edilecek. Eğer ifade yanlış ise bu sefer if bloğu atlanacak ve else bloğu çalıştırıldıktan sonra akışa devam edilecek. Burda belirtmek istediğim bir nokta var: ufak da olsa performans sağlaması açısından, her zaman daha fazla çalışacağı düşünülen kod if bloğuna, daha az çalışacak olan kod ise else bloğuna yazılmalıdır. Örneğin bir ifadeyi şu iki şekilde yazabilirsiniz:
if (a > 0)
{
//Sıfırdan büyükse bunları yap
}
else
{
//Sıfırdan küçükse bunları yap
}
if (a < 0)
{
//Sıfırdan küçükse bunları yap
}
else
{
//Sıfırdan büyükse bunları yap
}
Görüldüğü gibi iki şekilde de yazabiliriz. Demek istediğim, kod gereği eğer ki a değişkeni çoğu zaman sıfırdan büyük olacaksa üstteki blok, çoğu zaman sıfırdan küçük olacaksa alttaki blok kullanılmalı. Çünkü yazdığınız kod bellekte saklanırken if koşulunun hemen altındaki kod, programın devamı gibi kodun hemen altına eklenir; ancak else ifadesi bellekte farklı bir yerde bulunabilir. Dolayısıyla else koşuluna dallanmak çok az da olsa ekstra zaman gerektirir.
Yine benzer bir performans meselesi de sıfır ile karşılaştırma yaparken karşımıza çıkmakta. a >= 1 yazmak yerine mümkünse a > 0 yazılmalıdır (tabi ki a değişkeni int tipinde ise). Sebebini açıklamaya başladığım anda çok uzun olacağını düşündüm ve ayrı bir yazı yazmaya karar verdim. Kısacası sıfır değeri işlemcinin kendi içerisinde daima tutulduğundan, sıfır ile karşılaştırma işlemleri daha hızlı yapılır.
Yazmış olduğumuz kod bloğuna bir karşılaştırma daha eklememiz gerekebilir. Yani büyüklük karşılaştırmasında üç durum mevcut: a > b, b > a ve a = b. Bu üç durumu da içeren koşul yapısını da şu şekilde yazabiliriz:
int a = 3;
int b = 4;
if (a > b)
{
Console.WriteLine("a sayısı b sayısından büyüktür.");
}
else if (a < b)
{
Console.WriteLine("a sayısı b sayısından küçüktür.");
}
else
{
Console.WriteLine("a sayısı b sayısına eşittir.");
}
Aslında buradaki yapı, iç içe geçirilmiş if – else yapısından farklı bir şey değildir. Sadece kolaylık olması açısından bazı parantezler söz diziminden kaldırılmış. Bu else if yapısını istediğiniz kadar çoğaltabilirsiniz.
Gelelim switch – case yapılarına. Bu yapı da if – else gibi çalışır aslında. Yazılacak olan koşul fazla ise okunabilirliği arttırmak açısından switch – case kullanılabilir. Örnek vermek gerekirse:
int islem = 1;
switch (islem)
{
case 1:
Console.WriteLine("1");
break;
case 2:
Console.WriteLine("2");
break;
case 3:
case 4:
Console.WriteLine("3-4");
break;
default:
Console.WriteLine("Gecersiz");
break;
}
Koddan da anlayacağınız gibi switch (değişken) tanımlamasındaki değişkenin değeri, yazdığımız case değerleri ile kontrol ediliyor. Burada islem = 1 olduğu için case 1 ifadesine girilecek ve ekrana 1 yazılacak ardından da break komutu ile switch’ten çıkılacak. Burda birkaç ekstra özellik var, kodda da göreceğiniz gibi case 3 durumunun kodu yok ve hemen altında case 4 tanımlanmış. Eğer böyle yazarsanız 3 ve 4 için aynı işlemi yap anlamına gelecektir. Bir diğer nokta da bir nevi hata kontrolü olarak da kullanılabilecek olan default anahtar kelimesi. Eğer değişkenin değeri yazdığımız case ifadeleri arasında bulunamazsa otomatik olarak default ifadesi çalıştırılacak. Yazmak zorunda değilsiniz elbette, yazmadığınız taktirde switch bloğu içerisinde hiçbir şey yapılmadan çıkılacaktır.
Bu ders çok uzun oluyor gibi, o yüzden for – foreach – while ifadelerini bir sonraki derse bırakıyorum. Bir sonraki derste görüşmek ümidiyle…
c# biliyorum ama bayadır php ile yazıyordum. Bu dersler bence şahane. Herşey açık ve net anlatılmış genelde böyle olmaz. Tekrarım için çok iyi. Emeğinize sağlık 🙂
Faydalı olabildiysem ne mutlu bana 🙂