Switch ifadeleri C# programlama dilinde kullandığımız temel ifadelerden biridir. Kullanımına ilişkin yazdığım makaleye ayrıca bakmak isterseniz buradan okuyabilirsiniz.
İlk olarak klasik bir switch ifadesi örneği yazalım. Sade bir şekilde, verilen gün indeksine ait günün ismini dönen bir kod bloğu olsun.
int day = 1;
string dayName;
switch (day)
{
case 1 : dayName = "Pazartesi";
break;
case 2 : dayName = "Sali";
break;
case 3 : dayName = "Carsamba";
break;
case 4 : dayName = "Persembe";
break;
case 5 : dayName = "Cuma";
break;
case 6 : dayName = "Cumartesi";
break;
case 7 : dayName = "Pazar";
break;
default: dayName = "Hatali Gun!";
break;
}
Console.WriteLine(dayName);
Yukarıdaki kod bloğunda da aslında büyük bir sorun diyebileceğimiz bir şey yoktur fakat, case sayısı arttıkça, bu blok uzayacak ve aslında kodda kalabalık yapacak "case", ":", "break" keywordleri eklememiz gerekecek. Bu tarz sadece string atama yaptığımız bir switch bloğunu aşağıdaki gibi daha sade bir şekilde ve daha kolay genişletebilir hale getirebiliriz.
int day = 1;
string dayName = day switch
{
1 => "Pazartesi",
2 => "Sali",
3 => "Carsamba",
4 => "Persembe",
5 => "Cuma",
6 => "Cumartesi",
7 => "Pazar",
_ => "Hatali Gun!"
};
Console.WriteLine(dayName);
Bu şekilde de string atama kontrolümüzü daha okunur bir şekilde yapabilirsiniz.
Farkedeceğiniz üzere son kısımda yer alan "_" kısmı, klasik switch ifadesindeki "default" bloğuna denk gelmektedir.
Şimdi diyeceksiniz ki, "sadece kod biraz daha kısa gözüksün diye bu kullanımı mı çıkartmış Microsoft?". Tabi ki de bu kadar değil bu kullanımın getirdiği kolaylıklar. Şimdi diğer kolaylıklarına değinelim. Bunun için öncellikle bir tane Employee sınıfı oluşturuyorum.
class Employee
{
public int TitleId { get; set; }
public string FullName { get; set; }
public string Department { get; set; }
}
Null Object Kontrolü
Program akışında null object'ler ile sık sık karşılaşıyoruz. Program logic'indeki bir hatadan, db'deki hatalı bir kayıttan vs. null object'ler ile başa çıkmamız gerekebiliyor. Bunun için yazdığımız class üzerinden yeni bir switch bloğu oluşturalım.
var juniorDeveloper = new Employee()
{
TitleId = 1,
FullName = "Ahmet Birinci"
};
string titleName = juniorDeveloper.TitleId switch
{
1 => "Stajyer",
2 => "Junior Developer",
3 => "Mid Developer",
4 => "Senior Developer",
5 => "Team Lead",
_ => "Hatalı Id"
};
Console.WriteLine(titleName);
Kodu çalıştırdığımızda "Stajyer" Çıktısını verecektir.
Ama burada bize null bir object gelmiş olsaydı, aşağıdaki gibi null object hatasıyla karşılacaktık.
Bu tarz null checkleri yapabilmek, object'e ait koşullar oluşturabilmek için, "Property Pattern" diye adlandırılan farklı bir özelliğe değineceğim. Bunun için yukarıda yeni yazdığımız switch bloğunu aşağıdaki gibi güncelleyelim.
string titleName = juniorDeveloper switch
{
{ TitleId: 1 } => "Stajyer",
{ TitleId: 2 } => "Junior Developer",
{ TitleId: 3 } => "Mid Developer",
{ TitleId: 4 } => "Senior Developer",
{ TitleId: 5 } => "Team Lead",
_ => "Hatalı Id"
};
Console.WriteLine(titleName);
Bu sayede switch içerisine gönderdiğimiz object'in değerlerinin dolu olmasını da kontrol ediyor olacağız .
Koşullu Switch İfadeleri
Switch içerisine gönderdiğimiz object'e ait koşulları da yazabiliriz. Buna bir örnek vermek gerekirse;
var employee = new Employee()
{
TitleId = 1,
FullName = "Ayşe İkinci",
Department = "Sales"
};
string titleName = employee switch
{
{Department: "IT", TitleId: 1 } => "Stajyer IT",
{Department: "Sales", TitleId: 1 } => "Stajyer Pazarlamacı",
_ => "Hatalı Id"
};
Console.WriteLine(titleName);
Şirkette stajyer genel bir ünvandır ve farklı departmanda stajyer'ler olabilir. Bunun için sadece TitleId değerine bakmak yerine Department değerine de bakmak gerekebilir. Bunun için iki property'yi de switch içerisinde yukarıdaki gibi kontrol edebiliriz.
Class type Kontrolü
Bu yapı içerisinde objeclerimizin class tiplerine göre de filtrelemelerimizi yapabiliriz. Bunun için öncellikle daha önce eklediğimiz Employee sınıfından kalıtım alan yeni "Director" class'ı oluşturalım.
class Director : Employee
{
}
Yazdığımız switch ifadesini de aşağıdaki gibi güncelleyebiliriz.
string titleName = employee switch
{
Employee { Department: "IT", TitleId: 1 } => "Stajyer IT",
Employee { Department: "IT", TitleId: 2 } => "Junior Developer",
Employee { Department: "IT", TitleId: 3 } => "Mid Developer",
Director { Department: "IT" } => "CTO",
_ => "Hatalı Id"
};
Bu sayede farklı class tiplerine göre koşullar da yazabiliriz.
Kaynak;
Microsoft Doc