📦 Generics = Type-Safe Reusable Code
Object types lose type safety. Generics preserve types. Reusable code, compile-time safety, no casting.
❌ Without Generics
public class List
{
private object[] _items;
public void Add(object item) { }
public object Get(int index) { }
}
// Boxed int, cast required
✅ With Generics
public class List{ private T[] _items; public void Add(T item) { } public T Get(int index) { } } // Type-safe, no casting
🎯 Generic Methods and Constraints
// Generic method public T GetDefault() where T : new() { return new T(); } // Generic class with constraint public class Repository where T : class, new() { private List _items = new List (); public void Add(T item) => _items.Add(item); public T GetFirst() => _items.FirstOrDefault(); } // Multiple constraints public class Service where T : class, IDisposable, new() { // T must be class, implement IDisposable, have default constructor } // Covariance and Contravariance IEnumerable
💡 Common Generics
- List<T> (type-safe list)
- Dictionary<TKey, TValue>
- Nullable<T> (int?)
- Task<T> (async result)
- Func<T, TResult> (lambda)
“Generics made my code type-safe and reusable. No more casting, compile-time safety. Essential C# feature.”
