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ı¶
-
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);
-
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");
-
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)¶
-
where T : class
public class ReferenceTypeContainer<T> where T : class { public T Value { get; set; } }
-
where T : struct
public class ValueTypeContainer<T> where T : struct { public T Value { get; set; } }
-
where T : new()
public class DefaultConstructorContainer<T> where T : new() { public T CreateInstance() { return new T(); } }
-
where T : BaseClass
public class BaseClassContainer<T> where T : BaseClass { public void DoSomething(T item) { item.BaseMethod(); } }
-
where T : Interface
public class InterfaceContainer<T> where T : IComparable { public int Compare(T a, T b) { return a.CompareTo(b); } }
Jenerik Koleksiyonlar¶
-
List
List<string> names = new List<string>(); names.Add("Ahmet"); names.Add("Mehmet");
-
Dictionary
Dictionary<int, string> users = new Dictionary<int, string>(); users.Add(1, "Ahmet"); users.Add(2, "Mehmet");
-
Queue
Queue<string> messages = new Queue<string>(); messages.Enqueue("İlk mesaj"); messages.Enqueue("İkinci mesaj");
-
Stack
Stack<int> numbers = new Stack<int>(); numbers.Push(1); numbers.Push(2);
Jenerik Delegeler¶
-
Func
Func<int, int> square = x => x * x; int result = square(5); // 25
-
Action
Action<string> print = message => Console.WriteLine(message); print("Merhaba Dünya");
-
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ı¶
- Jenerik Temelleri
- Jenerik nedir ve ne işe yarar?
- Jeneriklerin avantajları nelerdir?
-
Jenerikler ve boxing/unboxing arasındaki ilişki nedir?
-
Jenerik Kısıtlamalar
- Jenerik kısıtlamalar nelerdir?
- Hangi durumlarda hangi kısıtlamaları kullanmalıyız?
-
Jenerik kısıtlamaların performans etkisi nedir?
-
Jenerik ve Tip Güvenliği
- Jenerikler tip güvenliğini nasıl sağlar?
- Jenerikler ve runtime tip kontrolü nasıl çalışır?
-
Jeneriklerde tip dönüşümleri nasıl yapılır?
-
Jenerik Koleksiyonlar
- Jenerik koleksiyonlar nelerdir?
- Jenerik koleksiyonların avantajları nelerdir?
-
Hangi durumda hangi jenerik koleksiyonu kullanmalıyız?
-
Jenerik Metodlar
- Jenerik metodlar nasıl tanımlanır?
- Jenerik metodların kullanım alanları nelerdir?
-
Jenerik metodlarda tip çıkarımı nasıl çalışır?
-
Jenerik ve Interface'ler
- Jenerik interface'ler nasıl tanımlanır?
- Jenerik interface'lerin kullanım alanları nelerdir?
-
Jenerik interface'lerde covariance ve contravariance nedir?
-
Jenerik ve Delegeler
- Jenerik delegeler nasıl tanımlanır?
- Func, Action ve Predicate arasındaki farklar nelerdir?
-
Jenerik delegelerin kullanım alanları nelerdir?
-
Jenerik ve Performans
- Jeneriklerin performans etkisi nedir?
- Jeneriklerde memory kullanımı nasıldır?
-
Jeneriklerde boxing/unboxing nasıl önlenir?
-
Jenerik ve Reflection
- Jenerik tiplerle reflection nasıl kullanılır?
- Jenerik tiplerin runtime'da oluşturulması nasıl yapılır?
-
Jenerik tiplerin tip bilgisi nasıl alınır?
-
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ı¶
-
Jenerik Stack
public class GenericStack<T> { // Implementasyon }
-
Jenerik Sıralama
public static class GenericSorter { public static void Sort<T>(T[] array) where T : IComparable<T> { // Implementasyon } }
-
Jenerik Cache
public class GenericCache<TKey, TValue> { // Implementasyon }
-
Jenerik Repository
public interface IGenericRepository<T> where T : class { // Interface tanımı }
-
Jenerik Validator
public class GenericValidator<T> { // Implementasyon }