C# swicth case yapısı çoğu programlama dilinde yerleşik olarak bulunur ve switch case kullanımı neredeyse aynıdır bizde if-else ile yapılan kontrolleri switch case ile nasıl yapıldığını ve çeşitli kullanımlarını bol örneklerle göreceğiz.
C# Switch Case Nedir, Örnekli Nasıl Kullanılır?
Giriş metninde if-else ile yapılan kontrollerin c# switch case yapısı ile nasıl yapılabileceğini vurgulamıştık if-else yapıları için alternatif olarak kullanabileceğiniz bir yapıdır.
Ufak bir örnek ile if-else ve switch case yapısının nasıl kullanılabileceğini görelim.
If-Else
1 2 3 4 5 6 7 8 | int number = 1; if(number == 1) { Console.WriteLine("Durum 1"); } else if (number == 2) { Console.WriteLine("Durum 2"); } else { Console.WriteLine("Varsayılan durum"); } |
Şimdide If Else ile yazdığımız örneği switch case ile nasıl yazıldığına gözatalım.
Switch Case
1 2 3 4 5 6 7 8 9 10 11 12 13 | int number = 1; switch (number) { case 1: Console.WriteLine("Durum 1"); break; case 2: Console.WriteLine("Durum 2"); break; default: Console.WriteLine("Varsayılan durum"); break; } |
Switch case’i bu örnek üzerinden anlatmak gerekirse switch parantezleri arasına aldığımız number adlı değişkene sahip değer case ile işaretlediğimiz ilgili değere direkt olarak yönlendirilip ilgili case bloğunun break ile durdurma bölgesi olarak işaretlediğimiz kısma kadarki kod bloklarımız çalışmış olacaktır eğer break; satırı unutulur ise compile time’da hata fırlatılacaktır, üstteki örnekte number değişkeninin değeri 1 olduğu için case 1 bloğu çalışacaktır.
default bloğu if-else kontrolündeki else’e karşılık gelmektedir eğer number içerisindeki değer hiçbir case bloğundaki değer ile eşleşmiyor ise default bloğu çalıştırılacaktır.
Sonuç
Üstteki sonuç demosunda yer alan kod bloklarına Random sınıfı dahil edildi böylelikle 0=<3 arasındaki değer üretildiğinde hangi case bloklarının çalıştığını dinamik olarak görebiliyor olacağız.
Birden Fazla Case İçin Aynı Bloğu Çalıştırma
Bu duruma verilebilecek en iyi örnek DateTime.Now.DayOfWeek enum’ı ile haftanın günleri için verilen sayısal değere göre haftaiçi yada haftasonunda olup olmadığımızı ekrana yazdırmak olacaktır.
1 2 3 4 5 6 7 8 9 10 11 12 13 | switch(DateTime.Now.DayOfWeek) { case DayOfWeek.Monday: case DayOfWeek.Tuesday: case DayOfWeek.Wednesday: case DayOfWeek.Thursday: case DayOfWeek.Friday: Console.WriteLine("Haftaiçindeyiz çalışmaya devam..."); break; case DayOfWeek.Saturday: case DayOfWeek.Sunday: Console.WriteLine("Dinlen şimdi pazartesi iş bizi bekler..."); break; } |
Dotnetfiddle sistem saati gününe göre yani bugün için dinamik olarak ilgili case bloğu çalıştırılıyor olacaktır.
Sonuç
Üstteki kod bloğunu isterseniz şu şekilde değiştirip kodu kısaltabilirsiniz DateTime.Now.DayOfWeek özelliğinin dönebileceği 7 tür enum vardır siz bu durumda şunu yapabilirsiniz hafta sonu günleri olan cumartesi ve pazar için case bloğu yazıp hafta içi için yazdığımız case bloklarını silip default: bloğuna alttaki gibi yazarakda kodunuzu kısaltabilirsiniz. Bunu if-else yapısında else bloğunda yapabiliyoruz zaten ve default: ifadesinin else ifadesine karşılık geldiğini de daha önce paylaşmıştık.
Üstteki kodu switch-case-default yapısını kullanacak şekilde yaparsak son hali şu olmalı.
1 2 3 4 5 6 7 8 9 | switch(DateTime.Now.DayOfWeek) { case DayOfWeek.Saturday: case DayOfWeek.Sunday: Console.WriteLine("Dinlen şimdi pazartesi iş bizi bekler..."); break; default: Console.WriteLine("Haftaiçindeyiz çalışmaya devam..."); break; } |
C# 7 ile switch-case yapımızda referans tiplerinin artık kullanabiliyoruz şimdiki örneğimizde bunun üzerine referans tiplerini kullanarak akışı nasıl yönlendirebileceğimizi göreceğiz.
C# 7 Switch Case Referans Tipi Karşılaştırması
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | using System; using System.Collections; using System.Collections.Generic; using System.Linq; public class Program { public static void Main(string[] args) { int[] values = { 2, 4, 6, 8, 10 }; ShowCollectionInformation(values); var names = new List<string>(); names.AddRange( new string[] { "Murat", "Sakine", "Ramazan", "Hatice" } ); ShowCollectionInformation(names); List<int> numbers = null; ShowCollectionInformation(numbers); } private static void ShowCollectionInformation(object coll) { switch (coll) { case Array arr: Console.WriteLine($"{arr.Length} elemenanı bulunan bir array."); break; case IEnumerable<int> ieInt: Console.WriteLine($"Ortalama: {ieInt.Average(s => s)}"); break; case IList list: Console.WriteLine($"{list.Count} eleman."); break; case IEnumerable ie: string result = ""; foreach (var item in ie) result += "${e} "; Console.WriteLine(result); break; case null: // null değeri için hiçbirşey yapılmayacak ve switch ifadesindeki değer null olsa dahi bu bloğa uğramayacak. break; default: Console.WriteLine($"Türü > {coll.GetType().Name}"); break; } } } |
Sonuç
Peki üstteki kodu if-else bloğu ile yazabilir miydik? Tabiki yazabiliriz altta örnek kod bloğunu görebilirsiniz.
Referans Tipi Eşleştirmeleri İçin Alternatif Olarak If-Else blokları İle Çalışmak
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | using System; using System.Collections; using System.Collections.Generic; using System.Linq; class Example { static void Main(string[] args) { int[] values = { 2, 4, 6, 8, 10 }; ShowCollectionInformation(values); var names = new List<string>(); names.AddRange( new string[] { "Murat", "Sakine", "Ramazan", "Hatice" } ); ShowCollectionInformation(names); List<int> numbers = null; ShowCollectionInformation(numbers); } private static void ShowCollectionInformation(object coll) { if (coll is Array) { Array arr = (Array) coll; Console.WriteLine($"{arr.Length} elamanlı bir dizi."); } else if (coll is IEnumerable<int>) { IEnumerable<int> ieInt = (IEnumerable<int>) coll; Console.WriteLine($"Ortalama: {ieInt.Average(s => s)}"); } else if (coll is IList) { IList list = (IList) coll; Console.WriteLine($"{list.Count} eleman."); } else if (coll is IEnumerable) { IEnumerable ie = (IEnumerable) coll; string result = ""; foreach (var item in ie) result += "${e} "; Console.WriteLine(result); } else if (coll == null) { // Buraya eğer coll değeri null ise girilecektir fakat switch case yapısında girilmediğini görmüştük. } else { Console.WriteLine($"An instance of type {coll.GetType().Name}"); } } } |
Case Bloğunda When Kullanımı
C# 7 ile beraber gelen bu özellikle case bloklarında when ile koşul belirterek bu koşula göre case bloğunun çalışıp çalışmamasını sağlayabilirsiniz bununla ilgili altta basit bir örnek yer almaktadır.
Alttaki kod bloğunda göreceğiniz üzere senaryomuz şudur;
- En temel anlamda yer alan Person sınıfı var Employee, Boss ve Secretary sınıfları tarafından miras alınarak türetilmektedir.
- Case bloklarında when ifadesini kullanarak Age ve Name özelliğine göre mantıksal ifadeler oluşturuldu bu when kısmında tanımlanan ifadeler true olarak sonuçlandığında case bloğu işletilecektir.
Şimdi hemen koda geçelim ve sonuç kısmında case bloklarında kullanılan when ifadesi ile nasl çalıştığını ne gibi sonuç ortaya çıktığına gözatalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | class Person { public string Name { get; set; } public int Age { get; set; } public Person(string name, int age) { Name = name; Age = age; } } class Employee : Person { public Employee(string name, int age) : base(name, age) { } } class Boss : Person { public Boss(string name, int age) : base(name, age) { } } class Secretary : Person { public Secretary(string name, int age) : base(name, age) { } } class Program { static void Main(string[] args) { var boss1 = new Boss("Murat ÖNER", 28); var boss2 = new Boss("Sakine ÖNER", 38); var employee1 = new Employee("Tevfik Tok", 40); var employee2 = new Employee("Suna Kalın", 32); var secretary = new Secretary("Handan Altun", 22); var unknowPerson = new Person("Şevket Tur", 59); CheckUsers(boss1, employee1, secretary, employee2, boss2, unknowPerson); } private static void CheckUsers(params Person[] persons) { var oldAge = 30; foreach (var person in persons) { switch (person) { case Boss boss when boss.Age >= oldAge: Console.WriteLine($"{boss.Name} adındaki yaşlı patron geldi."); break; case Boss boss when boss.Age < oldAge: Console.WriteLine($"{boss.Name} adındaki genç patron geldi."); break; case Employee employee when employee.Name.StartsWith("Tevfik"): Console.WriteLine($"Adı tevfik ile başlayan {employee.Name} tam adı olan personel algılandı."); break; case Employee employee when employee.Name.StartsWith("Suna") || employee.Age > oldAge: Console.WriteLine($"Adı suna ile başlayan ve {oldAge} yaşından büyük olan {employee.Name} tam adı olan personel algılandı."); break; case Secretary secretary when secretary.Age < oldAge: Console.WriteLine($"{oldAge} yaşın altında genç bir sekreter algılandı."); break; case Person persn: Console.WriteLine($"{persn.Name} adında bilinmeyen bir kişi algılandı."); break; } } } } |
Sonuç
C# Switch Case Yapısı İçin Kullanılacak Türler
C# 6 ve öncesinde switch case bloklarında herhangi bir değer türü kullanılabilmektedir.
- char
- array
- bool
- int, long gibi diğer sayısal değerler
- enum
C# 7 kullananlar üsttekiler dahil referans türü değişkenleri veya değerleri kullanabilirler ama null değer eşleşmesi case bloklarında yapılamamaktadır örnek olarak case null: şeklinde bir ifade oluşturabilirsiniz ve “compile time” aşamasında ve çalışmasında bir problem çıkmaz ama null bir referans tip geldiğinde bu eşleşmeyi C# sağlamayacaktır bu yüzden null değeri case ifadelerinizde kullanamazsınız.
C# Switch Case Yapısı İçin Önemli Bazı Kurallar
- Case ifadeleri arasında akışı yönetebilir farklı bir case bloğunu çalıştırabilirsiniz bunun için goto anahtar kelimesini kullanabilirsiniz.
- Default bloğunu en alta yazma gibi zorunluluk yoktur istenilen sıralamaya göre yazılabilir ama best practise olarak en alta yazılması önerilir ve default bloğunun kullanılmasıda zorunlu değildir.
- Switch yapısı içerisinde aynı değere sahip 2 case ifadesi kullanılamaz.
- İç içe switch case yapısını kullanabilirsiniz.
- Birden fazla case ifadesi için aynı kod bloklarını çalıştırmak için case bloklarını üst üste yazıp tek bir gövde tanımlayabilirsiniz üstte bununla ilgili bir örnek vermiştik.
- Swith parantezi içerisinde tanımladığımız değişken değeri türü ile case ifadelerinde kullandığımız değer türü aynı olmalıdır int-int, string-string, enum-enum v.b. gibi.
- return yada goto kullandığınız case bloklarında break ifadesini kullanmanıza gerek yoktur(tabi goto ve return eğer break ile aynı konumda akışı kesiyor yada yönlendiriyor ise).
C# switch case yapısı ile ilgili daha farklı örnek, olumlu-olumsuz tüm görüşeriniz için bana yorum yada mail yolu ile ulaşabilirsiniz.
Makalede kullanılan tüm örneklere ve C# ile ilgili diğer tüm örneklere github hesabımdan erişebilirsiniz buraya tıklayıp github hesabıma erişebilirsiniz.
En güncel içeriklerden faydanmak istemez misin?
[contact-field required="1" type="name" label="İsim"/][contact-field required="1" type="email" label="E-posta"/][contact-field type="consent" implicitconsentmessage="Bilgilerinizi göndererek, size e-posta göndermemize izin vermiş olursunuz. İstediğiniz zaman abonelikten çıkabilirsiniz." explicitconsentmessage="Zaman zaman size e-posta gönderebilir miyiz?" label="İzin"/]