
آموزش بهترین روش های کار کردن با جنریک ها (Generic) در سی شارپ
آموزش بهترین روش های کار کردن با جنریک ها (Generic) در سی شارپ یکی دیگر از آموزش های گروه آموزشی پرووید می باشد که در این قسمت آن را به شما معرفی می کنیم. این بسته آموزشی نیز یکی از دوره های آموزشی دیگر که در حوزه فارسی سازی آموزش های انگلیسی تنظیم شده است می باشد. عنوان این بسته آموزشی، آموزش بهترین روش های کار با جنریک ها (Generic) در سی شارپ 9 است که با نام اصلی Working with C# 9 Generics - Best Practices از شرکت Pluralsight منتشر شده است.
جنریک ها در سی شارپ
جنریک ها به شما امکان می دهند تا مشخصات نوع داده عناصر استفاده شده در کد درون یک کلاس یا یک متد را تا زمانی که واقعاً در برنامه به اجرا شدن نرسیده است به تعویق بیندازید. به عبارت دیگر، جنریک ها به شما امکان می دهند کلاس یا متدی بنویسید که می تواند با هر نوع داده ای کار کند.

با استفاده از جنریک ها، شما مشخصات کلاس یا متد را با پارامترهای قابل جایگزینی برای انواع داده ای مورد نظرتان را می نویسید. هنگامی که کامپایلر با تابع سازنده کلاس و یا یک فراخوانی متد مواجه می شود، کد خاصی را بر اساس نوع داده ای خاص لحاظ شده تولید می کند.
ویژگی های جنریک ها
جنریک ها در واقع تکنیکی هستند که برنامه های شما را به روش های زیر غنی می کنند:
به شما کمک می کند تا استفاده مجدد از کد و یا code reuse ایمنی تایپ و یا type safety و عملکرد و یا performance را به حداکثر برسانید.
شما می توانید کلاس های کالکشنی جنریک نیز ایجاد کنید. دات نت فریم ورک شامل چندین کلاس کالکشنی جنریک در فضای نام System.Collections.Generic است. می توانید از این کلاس های کالکشنی جنریک به جای کلاس های کالکشنی موجود در فضای نام System.Collections استفاده کنید.

می توانید اینترفیس ها، کلاس ها، متد ها و event ها و delegate ها جنریک ایجاد کنید.
میتوانید کلاسهای جنریکی را ایجاد کنید که محدود به فعال کردن دسترسی به متد های خاصی که در یک نوع داده ای خاصی ایجاد شده اند می باشند.
می توانید اطلاعاتی در مورد نوع های داده ای مورد استفاده در یک نوع داده جنریک را در زمان اجرا با استفاده از رفلکشن به دست آورید.
Generic Constraint و Interface در طراحی کلاسهای قابل استفاده مجدد
هنگام طراحی کلاسها و متدهای جنریک در C#، گاهی نمیتوان هر نوع دادهای را بدون محدودیت پذیرفت؛ زیرا پیادهسازی به قابلیتها یا اعضای مشخصی از نوع ورودی نیاز دارد. این آموزش به `Generic Constraint`ها میپردازد و نشان میدهد چگونه محدودیتهای نوع را برای تعریف قراردادهای روشنتر اعمال کنید. همچنین اینترفیسهای جنریک و تفاوت آنها با اینترفیسهای اختصاصی بررسی میشوند. برای مثال، هنگام طراحی یک کلاس که با مجموعهای از اشیا کار میکند، باید مشخص باشد نوعهای قابلقبول چه ویژگیهایی دارند. این موضوع به کامپایلر اجازه میدهد برخی ناسازگاریها را زودتر تشخیص دهد و قصد طراحی کد نیز واضحتر شود.
بخش مربوط به `IEnumerable<T>` زمینهای عملی برای درک اینترفیسهای جنریک و استفاده از آنها در کدهای C# فراهم میکند. بهجای وابستگی به یک نوع مشخص از مجموعه، میتوان با قرارداد عمومیتری کار کرد که برای انواع مختلف داده قابل استفاده باشد. آموزش همچنین به فراخوانی متدهای جنریک و ایجاد Generic Typeها از طریق `Reflection` میپردازد؛ موضوعی که برای کدهایی اهمیت دارد که نوع موردنیازشان تنها هنگام اجرا مشخص میشود. این مباحث در کنار Constraintها به شما کمک میکنند میان انعطافپذیری طراحی و محدودیتهای لازم برای حفظ صحت کد تعادل برقرار کنید.
Covariance و Contravariance در C# 9 چه کاربردی دارند؟
هنگام کار با نوعهای پایه و مشتقشده، رابطه میان دو نوع همیشه به این معنا نیست که نوعهای جنریک ساختهشده از آنها نیز به همان شکل قابل جایگزینی باشند. در این آموزش، مفهوم `Variance` و دو حالت `Covariance` و `Contravariance` بررسی میشوند تا بتوانید رفتار نوعهای جنریک را در چنین موقعیتهایی بهتر درک کنید. این موضوع بهخصوص هنگام طراحی و مصرف اینترفیسها و Delegateهای جنریک اهمیت دارد؛ زیرا جهت رابطه نوعها تعیین میکند در چه شرایطی میتوان یک مقدار را به جای نوع جنریک دیگری استفاده کرد، بدون آنکه قرارداد مورد انتظار برنامه نقض شود.
آموزش علاوه بر Variance، ایجاد کلاسها و متدهای جنریک و کار با Eventها و Delegateهای جنریک را نیز پوشش میدهد. در طراحی APIهای قابل استفاده مجدد، این مفاهیم به شما کمک میکنند نوع داده را به شکل دقیقتری منتقل کنید و از محدود کردن غیرضروری مصرفکنندگان جلوگیری کنید. برای نمونه، وقتی یک اینترفیس خروجی از نوع مشخصی ارائه میدهد یا یک Delegate ورودیهایی از نوع معینی دریافت میکند، قواعد Covariance و Contravariance بر امکان جایگزینی نوعها اثر میگذارند. درک این قواعد برای توسعهدهندگان باتجربه C# مفید است تا هنگام طراحی قراردادهای جنریک، از رفتار کامپایلر و محدودیتهای زبان آگاهانه استفاده کنند.
سرفصل مطالب آموزش ویدئویی بهترین روش های کار کردن با جنریک ها (Generic) در سی شارپ
فصل اول: مقدمه دوره آموزشی
- مقدمه دوره آموزشی
فصل دوم: کار کردن با اینترفیس های جنریک و Constraint ها
- بررسی ورژن های ابزارهای استفاده شده در این آموزش
- مقدمه
- مقدمه ای بر جنریک ها
- بررسی اینترفیس های جنریک و Specific
- اینترفیس های جنریک چگونه کار می کنند؟
- کار کردن با IEnumerable-T
- معرفی کردن Generic Constraint ها
- اعمال کردن Generic Constraint ها
- جمع بندی
فصل سوم: بررسی کردن Covariance و Contravariance
- مقدمه
- بررسی کردن و صدا زدن متدهای جنریک با استفاده از Reflection
- ایجاد کردن Generic Type ها با Reflection
- بررسی Type ها و Subtype ها و Variance
- Covariance چیست؟
- Contravariance چیست؟
- جمع بندی
فصل چهارم: ایجاد کردن کلاس های جنریک و متدهای جنریک
- مقدمه
- پیاده سازی کردن کلاس های جنریک
- استفاده کردن از Base Class ها و Subclass ها
- بررسی Fluent Generic ها
- پیاده سازی کردن متدهای جنریک
- بررسی کردن Tradeoff های بین کلاس های جنریک و متدهای جنریک
- جمع بندی
فصل پنجم: کار کردن با Event ها و Delegate های جنریک
- مقدمه
- آنالیز کردن و Handle کردن Event ها جنریک
- بررسی کردن Delegate های جنریک
- بررسی کردن -Predicate-T
- بررسی کردن -Action-T
- بررسی کردن -Func-T
- جمع بندی







