فصل 23 از 40 درس 1 از 1

Generics

Generics

بخشی از آموزش جامع C# و .NET 10

محتوای درس Generics

Generics امکان نوشتن Type و Methodهای قابل استفاده برای چند نوع داده را بدون از دست دادن Type Safety فراهم می‌کند. بخش بزرگی از کتابخانه استاندارد .NET بر همین قابلیت بنا شده است.

۱. Generic Type

Type Parameter مانند T جای نوع واقعی را هنگام استفاده می‌گیرد و کامپایلر سازگاری نوع را کنترل می‌کند.

مثال

class Box<T>{public T Value{get;} public Box(T v)=>Value=v;}
         Console.WriteLine(new Box<int>(5).Value);

در این مثال، مفهوم «Generic Type» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۲. Generic Method

Method Generic می‌تواند مستقل از Generic بودن Class نوع ورودی را پارامتری کند.

مثال

class Calculator { public int Add(int a,int b)=>a+b; }
         Console.WriteLine(new Calculator().Add(2,3));

در این مثال، مفهوم «Generic Method» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۳. Constraints

Constraintها قابلیت‌های موردنیاز T را مشخص می‌کنند؛ مانند class، struct، new() یا Interface.

مثال

static Guid GetId<T>(T x) where T:IEntity => x.Id;

در این مثال، مفهوم «Constraints» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۴. چند Type Parameter

Genericها می‌توانند چند پارامتر نوع مانند TKey و TValue داشته باشند.

مثال

class Pair<T1,T2>{public T1 First{get;init;}=default!; public T2 Second{get;init;}=default!;}

در این مثال، مفهوم «چند Type Parameter» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۵. مزایا

کاهش Cast، افزایش Type Safety و استفاده مجدد از الگوریتم‌ها از مزایای اصلی Generics هستند.

مثال

var ints=new List<int>(); var texts=new List<string>();

در این مثال، مفهوم «مزایا» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نام‌ها عمداً ساده انتخاب شده‌اند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب می‌شود.

۶. مثال‌های عملی

public class Repository<T> where T : class
         {
             private readonly List<T> _items = new();
         
             public void Add(T item) => _items.Add(item);
             public IReadOnlyList<T> GetAll() => _items;
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

static T FirstOrDefault<T>(IEnumerable<T> items, T fallback)
         {
             foreach (T item in items)
                 return item;
         
             return fallback;
         }

این نمونه عملی چند مفهوم فصل را در کنار هم قرار می‌دهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.

۷. خطاهای رایج

• استفاده از object به‌جای Generic و Castهای متعدد

• Constraintهای بیش از حد محدودکننده

• ساخت Generic فقط برای پیچیده‌تر کردن API بدون نیاز واقعی

۸. نکات اجرایی

• نام‌ها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.

• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.

• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.

۹. تمرین عملی

کلاس Cache<TKey,TValue> ایجاد کنید که Add، TryGet و Remove را با Dictionary داخلی پیاده‌سازی کند.

۱۰. جمع‌بندی

در این فصل، مبانی «Generics» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.