Skip to content

Generics

Genel Bakış

Generics (Jenerikler), C#'ta tip güvenliğini sağlarken kod tekrarını önleyen ve yeniden kullanılabilirliği artıran bir özelliktir. Jenerikler sayesinde, aynı kodu farklı veri tipleriyle kullanabiliriz.

Temel Jenerik Kullanımı

  1. Jenerik Sınıf

    public class GenericList<T>
    {
        private List<T> items = new List<T>();
    
        public void Add(T item)
        {
            items.Add(item);
        }
    
        public T Get(int index)
        {
            return items[index];
        }
    }
    
    // Kullanımı
    var stringList = new GenericList<string>();
    stringList.Add("Merhaba");
    
    var intList = new GenericList<int>();
    intList.Add(42);
    

  2. Jenerik Metod

    public static class GenericMethods
    {
        public static T Max<T>(T a, T b) where T : IComparable<T>
        {
            return a.CompareTo(b) > 0 ? a : b;
        }
    }
    
    // Kullanımı
    int max = GenericMethods.Max(5, 10);
    string longer = GenericMethods.Max("abc", "abcd");
    

  3. Jenerik Interface

    public interface IRepository<T>
    {
        T GetById(int id);
        void Add(T entity);
        void Update(T entity);
        void Delete(int id);
    }
    
    public class UserRepository : IRepository<User>
    {
        // Implementasyon
    }
    

Jenerik Kısıtlamalar (Constraints)

  1. where T : class

    public class ReferenceTypeContainer<T> where T : class
    {
        public T Value { get; set; }
    }
    

  2. where T : struct

    public class ValueTypeContainer<T> where T : struct
    {
        public T Value { get; set; }
    }
    

  3. where T : new()

    public class DefaultConstructorContainer<T> where T : new()
    {
        public T CreateInstance()
        {
            return new T();
        }
    }
    

  4. where T : BaseClass

    public class BaseClassContainer<T> where T : BaseClass
    {
        public void DoSomething(T item)
        {
            item.BaseMethod();
        }
    }
    

  5. where T : Interface

    public class InterfaceContainer<T> where T : IComparable
    {
        public int Compare(T a, T b)
        {
            return a.CompareTo(b);
        }
    }
    

Jenerik Koleksiyonlar

  1. List

    List<string> names = new List<string>();
    names.Add("Ahmet");
    names.Add("Mehmet");
    

  2. Dictionary

    Dictionary<int, string> users = new Dictionary<int, string>();
    users.Add(1, "Ahmet");
    users.Add(2, "Mehmet");
    

  3. Queue

    Queue<string> messages = new Queue<string>();
    messages.Enqueue("İlk mesaj");
    messages.Enqueue("İkinci mesaj");
    

  4. Stack

    Stack<int> numbers = new Stack<int>();
    numbers.Push(1);
    numbers.Push(2);
    

Jenerik Delegeler

  1. Func

    Func<int, int> square = x => x * x;
    int result = square(5); // 25
    

  2. Action

    Action<string> print = message => Console.WriteLine(message);
    print("Merhaba Dünya");
    

  3. Predicate

    Predicate<int> isEven = x => x % 2 == 0;
    bool result = isEven(4); // true
    

Jenerik ve Reflection

public class GenericReflection
{
    public static Type GetGenericType<T>()
    {
        return typeof(T);
    }

    public static object CreateGenericInstance(Type genericType, Type typeArgument)
    {
        Type constructedType = genericType.MakeGenericType(typeArgument);
        return Activator.CreateInstance(constructedType);
    }
}

Mülakat Soruları

  1. Jenerik Temelleri
  2. Jenerik nedir ve ne işe yarar?
  3. Jeneriklerin avantajları nelerdir?
  4. Jenerikler ve boxing/unboxing arasındaki ilişki nedir?

  5. Jenerik Kısıtlamalar

  6. Jenerik kısıtlamalar nelerdir?
  7. Hangi durumlarda hangi kısıtlamaları kullanmalıyız?
  8. Jenerik kısıtlamaların performans etkisi nedir?

  9. Jenerik ve Tip Güvenliği

  10. Jenerikler tip güvenliğini nasıl sağlar?
  11. Jenerikler ve runtime tip kontrolü nasıl çalışır?
  12. Jeneriklerde tip dönüşümleri nasıl yapılır?

  13. Jenerik Koleksiyonlar

  14. Jenerik koleksiyonlar nelerdir?
  15. Jenerik koleksiyonların avantajları nelerdir?
  16. Hangi durumda hangi jenerik koleksiyonu kullanmalıyız?

  17. Jenerik Metodlar

  18. Jenerik metodlar nasıl tanımlanır?
  19. Jenerik metodların kullanım alanları nelerdir?
  20. Jenerik metodlarda tip çıkarımı nasıl çalışır?

  21. Jenerik ve Interface'ler

  22. Jenerik interface'ler nasıl tanımlanır?
  23. Jenerik interface'lerin kullanım alanları nelerdir?
  24. Jenerik interface'lerde covariance ve contravariance nedir?

  25. Jenerik ve Delegeler

  26. Jenerik delegeler nasıl tanımlanır?
  27. Func, Action ve Predicate arasındaki farklar nelerdir?
  28. Jenerik delegelerin kullanım alanları nelerdir?

  29. Jenerik ve Performans

  30. Jeneriklerin performans etkisi nedir?
  31. Jeneriklerde memory kullanımı nasıldır?
  32. Jeneriklerde boxing/unboxing nasıl önlenir?

  33. Jenerik ve Reflection

  34. Jenerik tiplerle reflection nasıl kullanılır?
  35. Jenerik tiplerin runtime'da oluşturulması nasıl yapılır?
  36. Jenerik tiplerin tip bilgisi nasıl alınır?

  37. Jenerik Best Practices

    • Jenerik kullanırken dikkat edilmesi gerekenler nelerdir?
    • Jenerik isimlendirme kuralları nelerdir?
    • Jeneriklerde exception handling nasıl yapılır?

Örnek Kod Soruları

  1. Jenerik Stack

    public class GenericStack<T>
    {
        // Implementasyon
    }
    

  2. Jenerik Sıralama

    public static class GenericSorter
    {
        public static void Sort<T>(T[] array) where T : IComparable<T>
        {
            // Implementasyon
        }
    }
    

  3. Jenerik Cache

    public class GenericCache<TKey, TValue>
    {
        // Implementasyon
    }
    

  4. Jenerik Repository

    public interface IGenericRepository<T> where T : class
    {
        // Interface tanımı
    }
    

  5. Jenerik Validator

    public class GenericValidator<T>
    {
        // Implementasyon
    }
    

Kaynaklar