C# for ve foreach döngüsü arasındaki farklar

Bu makalede C# ile for ve foreach döngüleri arasındaki farkları inceleyeceğiz.

Böylece #1 numaralı istek makaleyi yazmış olacağım :)

Not : Issues sayfasında varolan makale isteklerini görebileceğinizi, hatta yeni makale isteğinde bulunabileceğinizi biliyor muydunuz?

Öncelikle for ve foreach döngülerini C# programlama dilinde nasıl kullanıyoruz, nasıl yazıyoruz, hemen hatırlayalım;

for döngüsünün özelliği, bir başlangıç noktasından bir bitiş noktasına doğru, istediğimiz adım aralığında ilerleyebilmesidir.

Örneğin, Nisan ayının günlerini ekranda göstermek istersek aşağıdaki gibi 0..30 arasında sırasıyla ilerleyen bir döngü oluşturabiliriz;

Eğer olimpiyatların hangi tarihlerde gerçekleştirildiğini ekranda göstermemiz gerekiyorsa, aşağıdaki örnekte olduğu gibi, dizi değişkeninin başlangıç değerini ilk olimpiyatın yapıldığı 1896 yılına ayarlar, döngünün bulunduğumuz yıla kadar (bulunduğumuz yıl dahil) sürmesini sağlar, her 4. yılı elde edebiliriz;

Hatta, istersek for döngüsünün tersten çalışmasını bile sağlayabiliriz;

foreach döngüsünün özelliği, bir listenin üzerinde adım adım ilerleyerek tüm öğelerini bize sadece-okunur olarak sağlamasıdır.

foreach döngüsünde unutulmaması gereken önemli nokta, döngü değişkeninin sadece-okunur (read-only) olmasıdır. Aşağıdaki örnekte olduğu gibi değişkenin değeri üzerinde değişiklik yapamayız;

for döngüleri genellikle bir dizinin öğeleri üzerinde gezinmek için kullanılır. Örneğin;

Bu kod örneğinde, şöyle bir problem var; döngünün ilk adımı gerçekleştikten sonra önce iLoop isimli döngü değişkeninin değeri 1 arttırılacak. Sonra iLoop değişkeninin değeri döngünün sonuna erişilip-erişilmediği belirlensin diye dizideki eleman adedi ile karşılaştırılacak.

Bir sonraki döngü adımının sonunda gene iLoop değişkenin değeri 1 arttırılacak ve döngünün sonuna gelinip-gelinmediğinin belirlenmesi için dizideki eleman adedi ile karşılaştırılacak.

Hatta dizideki eleman adedi ile karşılaştırma her döngü adımında tekrar tekrar yapılacak.

Çok önemli gibi gözükmese de, dizideki eleman adedini döngü öncesi bir değişkene alıp, döngü içerisinde hep bu değişken ile kontrol etmek, performansa olumlu katkı sağlayacaktır.

Not: döngünün başından sonuna kadar dizideki eleman adedinin değişmediğini varsayıyorum

Hatta, madem for döngüsünün ilk parçasında döngü değişkenini tanımlıyoruz, aynı anda ikinci bir değişken daha tanımlayamaz mıyız?

Tanımlayabiliriz :)

Aşağıdaki kod örneğinden de görebileceğiniz gibi, aynı anda iki değişken tanımlayıp, biri ile döngüyü ilerletmek, diğeri ile dizideki eleman adedini bir defa hesaplatmak mümkün;

Performans karşılaştırması için aşağıdaki küçük uygulamayı geliştirdim;

Sonuçlar, bilgisayarın konfigürasyonuna, o an çalışmakta olan uygulamalara, debug-release mode’lara, x86-x64 mimariler arasındaki farklara, .Net versiyonuna, vs göre o kadar fazla farklılık gösterebilir ki, performans konusuna çok vakit ayırmak istemedim.

Eğer yorumunuz veya sorunuz varsa, lütfen aşağıya yazınız. Sizin sistemlerinizde üretilecek sonuçları da merak ediyorum.

Benim kullanmakta olduğum notebook’ta sonuçlar aşağıdaki gibi;

CPU: i7 7700HQ x64
OS: Windows 10 (16241) 64bit
RAM: 32GB 2666MHz

for ve foreach döngüleri performans karşılaştırması

Benim ortamımda foreach döngüsü, for döngüsünden daha performanslı çıktı. 80.000 elemanlı bir dizide aradaki fark birkaç nanosaniye civarında olsa da, 800.000.000 elemanlı bir dizide fark yaklaşık 700ms civarına çıkıyor.

Çok elemanlı olmasa da sürekli üzerinde döndüğümüz diziler varsa, her seferinde kazanacağımız nanosaniyeler-milisaniyeler, toplamda büyük rakamlara ulaşabilir ;)

Windows 10 UWP uygulamalarını komut satırından çalıştırma (Command Line Activation)

Eski nesil Windows uygulamaları (Win32) ile yeni nesil Windows uygulamaları (UWP) arasında en önemli farklardan biri komut satırından etkinleştirme eksikliği idi.

Komut satırı üzerinden etkinleştirme eksikliğinden dolayı, UWP uygulamalarını komut satırına notepad.exe yazıp çalıştırır gibi çalıştıramıyorduk. UWP uygulamaları sadece Başlat Menüsü kısayolu üzerinden çalıştırılabiliyordu.

Haliyle parametre alarak ve ilgili parametre üzerinden başlatılabilme yeteneğine de sahip olamıyorlardı.

Windows 10 Insider 16226 sürümünden itibaren UWP projelerine App Execution Alias Extension ekleyerek bir komut satırı uzantısına sahip olmaları sağlanabiliyor.

Uygulamamıza bu özelliği katmak aslında çok kolay, hemen Visual Studio‘yu açalım ve CommandLineActivationProject isminde bir UWP projesi oluşturalım;

Yapmamız gereken iki adım var;

Sırayla bu adımları gerçekleştirelim;

Öncelikle Package.appxmanifest dosyasını açalım ve Extension‘lar içerisine AppExecutionAlias ekleyelim

Burada önemli nokta, Alias attribute‘une verdiğimiz değer ile uygulamamıza komut satırından erişilecek olması

Şimdi yapmamız gereken, App.xaml.cs dosyasını açmak ve içerisine OnActivated() methodunu eklemek.

OnActivated() methodunun aldığı args parametresinin Kind özelliği eğer ActivationKind.CommandLineLaunch değerine sahipse, demek ki uygulama komut satırından çalıştırılmıştır.

args parametresini CommandLineActivatedEventArgs tipine unbox edip, Operation özelliği aracılığı ile komut satırından çalıştırılan uygulamamıza geçilen parametreleri yakalayabiliyoruz.

Örnek ekran görüntüsü ise aşağıdaki gibi olacaktır;

Bu makale Command-Line Activation of Universal Windows Apps makalesi baz alınarak yazılmıştır :)

C# Multi-Dimensional Array (Dizi) ve Jagged Array (Dizi) arasındaki farklar

Birkaç hafta önce email üzerinden aldığım bir soruyu cevaplamaya çalışacağım.

Soru şu;

C# Multi-Dimensional Array ve Jagged Array arasındaki farklar nedir?

Uzun yıllardır yazılım geliştirme yapıyorum ve deneyimlerime göre Multi-Dimensional Array (Dizi), Jagged Array (Dizi)’ye göre birçok avantaja sahip.

Öncelikle, Multi-Dimensional Array daha doğrusal ve basit bir hafıza yerleşimine (memory map) sahip.

Jagged Array ise, aslında dizilerin dizisi gibi bir modelde olduğu için birçok hafıza içi yönlendirmelere neden oluyor.

Örneğin,

kodu işletildiğinde, CLR, (i x j) kadar (yani 10 x 30 = 300) öğeli bir dizi oluşturur.

multi değişkeninin Length özelliğine bakacak olursak, gerçekten 300 değerini görebiliriz.

Gene multi değişkeninin Rank özelliği, 2 değerine sahip olacak, çünkü multi değişkeni 2 boyutlu bir dizi. 0 ve 1 boyutlarında eşit uzunlukta değerler var.

Hatta GetLength() methodunda 0 veya 1 değerini verecek olursak, i (veya j) uzunluklarını alabiliriz.

Doğal olarak, multi değişkeninin herhangi bir öğesine erişmek, { 1.rakam x i + 2.rakam } indexli elemana erişmek demek;

Multi-Dimensional Array yapılarında veriyi hafızada tutmak, erişmek ve güncellemek, nispeten kolay.

Jagged Array ise, doğrusal bir hafıza haritasına sahip olmadığı için, Multi-Dimensional Array yapılarının sahip olduğu birçok avantaja sahip değildir.

Örneğin,

jagged değişkeninin Rank özelliği her zaman 1 değerine sahiptir.

Bir değere erişmek için Jagged Array değişkenler, şu şekilde davranır;

  • Önce, 10 öğeli dizinin 3 indexli elemanını bul
  • Sonra, 30 öğeli bir dizi olan bu elemanın 6 indexli elemanını bul

Yani, bir elemana ulaşabilmek için, her zaman 2 adımlı yol izlemek gerekiyor.

Ayrıca, Jagged Array yapılarında iki ardışık satırın aynı sayıda öğeli dizi olması zorunlu değil.

Yani yukarıdaki karşılaştırma true değer üretmeyebilir.

Benzetme yapmak gerekirse, Multi-Dimensional Array, bir tablo yapısına benzer, sütun sayısı ve satır sayısı tanımlanır, hücrelere erişilir.

Örneğin;

Bu kodu, 2 x 2 tabloya benzetebiliriz;

Halbuki Jagged Array yapılarında sütun sayıları, her satırda farklı olabilir.

Örneğin;

Bu kod ise, aşağıdaki yapıyı oluşturur;

Performans

Fakat CLR‘ın gerçekleştirdiği çeşitli performans optimizasyonlarından dolayı, Jagged Array yapıları, Multi-Dimensional Array yapılarından daha performanslı çalışıyor.

Örneğin,

Bu methodlardan üretilen IL koduna bakacak olursak;

Gördüğünüz gibi, Multi-Dimensional Array için üretilen IL kodu, Jagged Array için üretilen IL kodundan daha karmaşık ve doğal olarak çalıştırılması da daha uzun sürüyor.

Not : Bu makaleyi geliştirirken Stackoverflow‘dan çok faydalandım

Fazla Mesai Etkinliği Haziran 2017

19 Haziran 2017 akşamı Microsoft Türkiye ofisinde sevgili Microsoft RD arkadaşlarım Daron Yöndem, Hakan Uzuner ve Adam Cogan ile bir etkinlik organize ettik.

Fazla Mesai ismini verdiğimiz bu etkinlikte ben de Azure WebApps ve Azure Storage konularına değindim.

Fazla Mesai Etkinliği, Haziran 2017

Etkinliğe katılan herkese teşekkür ederim, umarım faydalı olmuştur.

.Net Core projelerine referans ve Nuget paketi eklemek

Bu makaleyi aslında kendime not oluşturmak için yazıyorum :)

.Net Core ve Asp.Net Core projelerine bir Nuget paketi eklemek için Visual Studio‘yu açıp, Solution Explorer‘da Dependencies üzerine sağ tuşla tıklamak ve Manage Nuget Packages menüsünü seçmek yeterli. Böylece açılan ekrandan istediğimiz paketi aratıp projemize ekleyebiliriz.

Fakat sizler de benim gibi Visual Studio yerine Visual Studio Code kullanmayı tercih ediyorsanız, ne yazık ki Nuget paketi eklemek için Visual Studio‘yu açmak gereksiz gelecektir.

Aslında komut satırı aracılığıyla (Visual Studio Code içerisinde gelen Terminal pencereside olur) aşağıdaki kodu çalıştırmamız yeterli;

Eğer projeye bir Nuget paketi değil, başka bir projeyi referans olarak eklemek istiyorsak, aşağıdaki kodu çalıştırabiliriz;

Engin Polat hakkında

Senior Software Engineer, @Microsoft

Ada ve Ege'nin babası ;)

Kategoriler

İstatistik

Makale Adedi: 484

Creative Commons Lisansı