Yükleniyor...

Generic’ler

C#’ta Generic’ler, farklı veri tipleriyle çalışabilen ve tür güvenliğini koruyan sınıflar, metotlar ve yapıların oluşturulmasını sağlayan güçlü bir özelliktir. Generic’ler, kodun yeniden kullanılabilirliğini artırır, tip dönüşümlerinden kaynaklanan hataları önler ve performansın korunmasını sağlar. Özellikle List, Dictionary\ gibi koleksiyonlarda ve algoritmaların tip bağımsız olarak çalıştırılmasında büyük fayda sağlar.
Generic’ler, bir sınıfın veya metodun hangi veri tipi ile çalışacağını belirlemeden tanımlanmasını sağlar ve tip bağımsız esnek bir yapı sunar. Bu özellik, yazılım mimarisinde modüler ve sürdürülebilir kod yazmayı kolaylaştırır. Generic’ler aynı zamanda OOP (nesne yönelimli programlama) prensipleri ile uyumludur ve polimorfizm, encapsulation ve abstraction gibi kavramları destekler.
Bu eğitimde okuyucu, Generic sınıf ve metodların tanımını, type constraints kullanmayı, koleksiyonlar ile entegrasyonunu ve gerçek dünya senaryolarında nasıl uygulanacağını öğrenecektir. Ayrıca, performans optimizasyonu, hata yönetimi ve yaygın tuzaklardan kaçınma gibi ileri düzey konular da ele alınacaktır.

Temel Örnek

text
TEXT Code
using System;

namespace GenericDemo
{
// Generic sınıf tanımı
public class Kutu<T>
{
private T icerik;

public void Ekle(T item)
{
icerik = item;
}

public T Al()
{
return icerik;
}
}

class Program
{
static void Main(string[] args)
{
// int tipi ile Generic kullanım
Kutu<int> intKutu = new Kutu<int>();
intKutu.Ekle(100);
Console.WriteLine("Kutu içeriği: " + intKutu.Al());

// string tipi ile Generic kullanım
Kutu<string> stringKutu = new Kutu<string>();
stringKutu.Ekle("Merhaba C#");
Console.WriteLine("Kutu içeriği: " + stringKutu.Al());
}
}

}

Bu temel örnekte, Kutu sınıfı Generic bir sınıftır ve T, sınıfın hangi tip ile çalışacağını belirler. Ekle metodu, Generic tipi kullanarak öğeyi saklar; Al metodu ise geri döndürür. Program içerisinde int ve string tipleri ile Kutu sınıfının farklı kullanımları gösterilmiştir. Generic’ler, derleme zamanında tip güvenliği sağlar, bu da tip dönüşüm hatalarını önler ve kodun yeniden kullanılabilirliğini artırır.
Generic kullanımı, OOP prensipleri ile uyumludur ve sürdürülebilir, okunabilir, modüler kod geliştirilmesini destekler. Bu yapı, gerçek dünya uygulamalarında veri güvenliği ve kod performansı açısından kritik bir avantaj sunar.

Pratik Örnek

text
TEXT Code
using System;
using System.Collections.Generic;

namespace AdvancedGenericDemo
{
// Generic repository sınıfı
public class Repository<T> where T : class
{
private List<T> items = new List<T>();

public void Ekle(T item)
{
if (item == null)
throw new ArgumentNullException(nameof(item), "Eleman null olamaz");
items.Add(item);
}

public T Ara(Predicate<T> kosul)
{
return items.Find(kosul);
}

public void HepsiniGoster()
{
foreach (var item in items)
{
Console.WriteLine(item.ToString());
}
}
}

class Urun
{
public string Ad { get; set; }
public decimal Fiyat { get; set; }

public override string ToString()
{
return $"{Ad} - {Fiyat} TL";
}
}

class Program
{
static void Main(string[] args)
{
Repository<Urun> urunRepo = new Repository<Urun>();
urunRepo.Ekle(new Urun { Ad = "Laptop", Fiyat = 15000 });
urunRepo.Ekle(new Urun { Ad = "Telefon", Fiyat = 8000 });

Console.WriteLine("Tüm ürünler:");
urunRepo.HepsiniGoster();

Urun pahaliUrun = urunRepo.Ara(u => u.Fiyat > 10000);
Console.WriteLine("Pahalı ürün: " + pahaliUrun);
}
}

}

Bu ileri düzey örnekte, Repository sınıfı Generic olarak tanımlanmış ve where T : class constraint kullanılarak yalnızca referans tiplerin kullanılması sağlanmıştır. Ekle metodu, null kontrolü ile güvenli veri ekler. Ara metodu Predicate kullanarak koşula bağlı arama yapar ve HepsiniGoster metodu tüm öğeleri listeler. Urun sınıfı, ToString metodunun override edilmesi ile konsolda okunabilir çıktılar sunar.
Bu örnek, Generic’lerin OOP prensipleri, hata yönetimi ve algoritmalarla birlikte kullanımı için ideal bir senaryodur. Ayrıca, performans ve tip güvenliği açısından C#’ta en iyi uygulamaları göstermektedir.

Generic’ler için C# en iyi uygulamalar ve yaygın hatalar:

  • Type constraints kullanarak tip güvenliğini sağlamak
  • Generic koleksiyonları (List, Dictionary\) tercih etmek
  • Null değer ve hata yönetimini doğru şekilde uygulamak
  • Fazla genellemeden kaçınarak kod karmaşıklığını önlemek
  • Boxing/unboxing işlemlerinden kaçınmak ve performansı optimize etmek
  • Bellek sızıntılarını önlemek için unmanaged kaynakları doğrudan saklamamak
  • Debugging sırasında gerçek tipleri kontrol etmek
  • Veri bütünlüğünü sağlamak ve girişleri doğrulamak

📊 Referans Tablosu

C# Element/Concept Description Usage Example
Generic Sınıf Farklı tiplerle çalışabilen sınıf public class Kutu<T> { T icerik; }
Generic Metod Farklı tiplerle çalışabilen metot public T Al<T>(T item) { return item; }
Constraints Tip sınırlamaları where T : class, new()
List<T> Generic liste List<int> sayilar = new List<int>();
Dictionary\<TKey,TValue> Anahtar-değer koleksiyonu Dictionary\<string,int> yaslar = new Dictionary\<string,int>();
Predicate<T> Koşullu arama ve filtreleme items.Find(u => u.Fiyat > 10000);

Özet ve sonraki adımlar:
Generic’ler, C#’ta güvenli, tekrar kullanılabilir ve performanslı kod yazmayı sağlar. Generic sınıflar, metodlar, type constraints ve tasarım desenleri ile modüler mimariler oluşturabilirsiniz. Gelecekte Stack, Queue, IEnumerable, IComparable gibi koleksiyonlar ve interface’ler ile Generic’leri daha ileri seviyede kullanmak önerilir. Bu bilgiler, projelerde kod kalitesini, performansını ve güvenliğini artıracaktır.

🧠 Bilginizi Test Edin

Başlamaya Hazır

Bilginizi Test Edin

Bu konudaki anlayışınızı pratik sorularla test edin.

4
Sorular
🎯
70%
Geçmek İçin
♾️
Süre
🔄
Deneme

📝 Talimatlar

  • Her soruyu dikkatle okuyun
  • Her soru için en iyi cevabı seçin
  • Quiz'i istediğiniz kadar tekrar alabilirsiniz
  • İlerlemeniz üstte gösterilecek