Anasayfa / C# / CONSOLE APPS / C# Diziler (Arrays)

C# Diziler (Arrays)

C# programlama dili eğitim serimizde, değişkenleri, veri tiplerini ve kontrol yapılarını geride bıraktık. Şimdi ise yazılım dünyasının en temel ve en sık kullanılan veri saklama yapılarından birine, yani Dizilere (Arrays) geçiş yapıyoruz.

Uygulama geliştirirken tekil değişkenlerle çalışmak (örneğin sadece bir kullanıcının yaşını veya tek bir ürünün fiyatını tutmak) başta yeterli görünse de, binlerce kullanıcının veya ürünün bilgisini tek tek değişkenlerde tutmak imkansızdır. İşte tam bu noktada, aynı tipteki çok sayıda veriyi tek bir çatı altında düzenli bir şekilde tutmamızı sağlayan C# Diziler devreye girer. C#, tasarım hedefleri gereği yazılım mühendisliği prensiplerini sıkı sıkıya destekler ve programlarımızın güvenliği için dizilerde sınır kontrolü (array bounds checking) gibi gelişmiş güvenlik önlemlerini otomatik olarak sunar.

Bu kapsamlı rehberde, C# dilinde dizilerin ne olduğunu, nasıl tanımlandığını ve modern C# projelerinde nasıl en verimli şekilde kullanıldığını günlük hayattan örneklerle inceleyeceğiz.


1. Dizi (Array) Nedir ve Neden İhtiyaç Duyarız?

Diziyi, içinde birden fazla bölmesi olan bir ilaç kutusu veya çok katlı bir apartman gibi düşünebilirsiniz. Apartmanın (dizinin) bir adı vardır, ancak içindeki her bir dairenin (elemanın) kendine ait bir numarası bulunur.

Eğer diziler olmasaydı, 5 kişilik bir sınıfın sınav notlarını tutmak için şu şekilde kod yazmamız gerekirdi:

int not1 = 85;
int not2 = 90;
int not3 = 78;
int not4 = 100;
int not5 = 60;

Bu yöntem 5 kişi için katlanılabilir olsa da, 500 kişilik bir okul için felakettir! Bunun yerine dizileri kullanarak “İçinde 5 adet tam sayı (int) tutabilen tek bir değişken” oluşturabiliriz.

2. C# Dilinde Dizi Tanımlama ve Değer Atama

C# dilinde bir dizi tanımlarken, tutacağımız veri tipinin yanına köşeli parantez [] ekleriz. Bu, bilgisayara “Ben tek bir değer değil, bu tipten bir liste (dizi) oluşturacağım” mesajını verir.

Temel Dizi Tanımlama Formülü: [VeriTipi][] [DiziAdı] = new [VeriTipi][ElemanSayısı];

Örnek Kod:

// İçerisinde 5 adet metin (string) tutacak 'ogrenciler' adında bir dizi oluşturduk.
string[] ogrenciler = new string;

// İçerisinde 10 adet tam sayı (int) tutacak 'fiyatlar' adında bir dizi oluşturduk.
int[] fiyatlar = new int;

Buradaki new anahtar kelimesi, bilgisayarın hafızasında (RAM) bu elemanlar için yeni bir boş alan ayrılmasını sağlar. Dizilerin en önemli özelliği, boyutlarının (eleman sayısının) başlangıçta belirlenmesi ve sonradan esnetilememesidir.

3. Dizilerde İndeks (Index) Mantığı ve Elemanlara Erişim

Dizilerle ilgili öğrenmeniz gereken en hayati kural şudur: Programlama dillerinde sayma işlemi 1’den değil, 0’dan başlar! Buna “Sıfır Tabanlı İndeksleme” (Zero-based indexing) denir.

Yani 5 elemanlı bir dizinin:

    1. elemanı 0. indekstedir.
    1. elemanı 4. indekstedir.

Şimdi yarattığımız boş öğrenci dizisinin odalarına (indekslerine) veri yerleştirelim ve bu verileri ekrana yazdıralım:

string[] sehirler = new string; // 3 elemanlı dizi

// Dizinin indekslerine sırasıyla değer atıyoruz
sehirler = "İstanbul"; // Birinci eleman
sehirler = "Ankara";   // İkinci eleman
sehirler = "İzmir";    // Üçüncü eleman

// sehirler = "Antalya"; // HATA! Dizimiz 3 elemanlı olduğu için 3. indeks (dördüncü eleman) sınır dışıdır.

Console.WriteLine($"Seçilen Şehir: {sehirler}"); // Ekrana 'Ankara' yazar.

C# derleyicisi ve çalışma zamanı (runtime), sizin dizinin sınırları dışına (örneğin 3 elemanlı bir dizinin 5. indeksine) erişmeye çalışıp çalışmadığınızı otomatik olarak denetler (array bounds checking) ve böyle bir durumda programın çökerek güvenlik açığı oluşturmasını engellemek için IndexOutOfRangeException hatası fırlatır.

Dizi Tanımlamanın Kısa Yolu: Eğer dizinin içine koyacağınız elemanları en başından biliyorsanız, tek satırda hem diziyi oluşturup hem de doldurabilirsiniz:

int[] sinavNotlari = { 85, 90, 78, 100, 60 };

4. Diziler ve Döngülerin Güç Birliği

Dizilerdeki verileri tek tek Console.WriteLine() ile ekrana yazdırmak pratik değildir. Uygulama geliştirirken, dizilerin üzerinde gezinmek için her zaman döngüleri (loops) kullanırız. C# öğrenirken dizilerle birlikte for ve foreach döngülerini uygulamak (implement arrays, foreach loops) en temel yazılım pratiklerinden biridir.

For Döngüsü ile Dizi Okuma: Dizilerin .Length özelliği, o dizinin kaç elemanlı olduğunu verir.

string[] aylar = { "Ocak", "Şubat", "Mart", "Nisan" };

for (int i = 0; i < aylar.Length; i++)
{
    Console.WriteLine($"{i + 1}. Ay: {aylar[i]}");
}

Foreach Döngüsü ile Dizi Okuma (En Pratik Yöntem): Eğer dizinin tüm elemanlarını baştan sona sadece okuyacaksanız, yazımı en kolay olan foreach döngüsü tercih edilir.

string[] renkler = { "Kırmızı", "Mavi", "Yeşil" };

foreach (string renk in renkler)
{
    Console.WriteLine(renk);
}

5. Hayat Kurtaran Dizi Metotları (Array Methods)

C# dilinde diziler üzerinde işlem yapmanızı sağlayan birçok hazır komut (metot) bulunmaktadır. Sık kullanacağınız bazı metotlar şunlardır:

  • Array.Sort(dizi): Dizinin içindeki elemanları küçükten büyüğe (veya A’dan Z’ye) sıralar.
  • Array.Reverse(dizi): Diziyi tam tersine çevirir (son eleman ilk eleman olur).
  • Array.IndexOf(dizi, deger): Aradığınız bir verinin dizinin kaçıncı indeksinde olduğunu bulur.
int[] rakamlar = { 5, 2, 8, 1, 9 };

Array.Sort(rakamlar); // Dizi artık: 1, 2, 5, 8, 9 oldu.
Array.Reverse(rakamlar); // Dizi artık: 9, 8, 5, 2, 1 oldu.

6. Modern C# Mimarilerinde Dizilerin Yeri ve Optimizasyon

C# dili geliştikçe dizilerle çalışma şeklimiz de çok daha modern ve performanslı bir hale bürünmüştür:

  • Pattern Matching (Desen Eşleştirme): C# 11 sürümü ile birlikte, diziler (arrays) ve listeler üzerindeki desen eşleştirme özellikleri inanılmaz derecede geliştirilmiştir. Artık bir dizinin sadece belirli bir desene uyup uymadığını (örneğin “ilk elemanı 1, son elemanı 5 olan bir dizi mi?”) çok kısa kodlarla test edebilirsiniz.
  • Bellek ve Performans (Span Kullanımı): Diziler bellekte (RAM) peş peşe (contiguous) sıralanan veri yığınlarıdır. Eğer .NET ortamında çok yüksek performanslı ve düşük bellek tüketimli bir proje (örneğin saniyede binlerce işlem yapan bir API) geliştiriyorsanız, diziler üzerinde işlem yaparken klasik koleksiyonlar yerine Span<T> yapısını kullanmanız tavsiye edilir. Span<T>, belleğin ardışık bir bölümünü (dizileri) doğrudan ve kopyalama yapmadan temsil edebildiği için performans darboğazlarını (overhead) ortadan kaldırır.

Sonuç

Bu makalemizde C# programlamanın vazgeçilmezi olan Diziler (Arrays) konusunu en temelden alıp; tanımını, indeks mekanizmasını, döngülerle (foreach) entegrasyonunu ve gelişmiş özelliklerini işledik. Dizilerin boyutlarının sabit olduğunu unutmayın. Değişken boyutlu, yani eleman ekledikçe kendi kendine büyüyebilen yapılar için bir sonraki konumuz olan Listeler (List) rehberine geçiş yapabilirsiniz. Bol kodlamalı ve hatasız günler dileriz!

Etiketlendi:

Cevap bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir