#C امکانی به نام generic ها را ارائه داده است تا نیاز به cast کردن برای بهبود type safe را حذف نماید و ایجاد کلاسها و متدهای generic را برای ما راحت تر کند.
این مقاله، سرفصلی از دوره آموزشی زیر میباشد:
- کلاسها و سازنده ها
- ویژگیها
- constant ،Static member ها و Extension Method ها
- Anonymous Type ها و Nullabel Type ها
- ساختارها
- شمارنده ها
- وراثت
- Interface ها
- کلاسهای Abstract
- Generic ها
- Queue, Stack, Hashtable
- Generic List و Dictionary
- Delegate ها
اگر می خواهید محتویات کامل این دوره را ببینید ، می توانید بر روی لینک سطح متوسطه #C کلیک کنید.
برای دانلود سورس مثالها، میتوانید بر روی لینک سورس generic ها در #C کلیک کنید.
ما این مقاله را به قسمتهای زیر تقسیم میکنیم:
Generic Type T
برای ایجاد کلاس generic، باید یک type بین دو علامت کوچکتر و بزرگتر قرار دهیم:
1 2 3 4 |
public class CollectionInitializer<T> { ... } |
در این مثال، T به عنوان یک placeholder برای type ای که میخواهیم با آن کار کنیم عمل میکند. ما باید این type را زمانیکه این کلاس generic را نمونه سازی میکنیم مشخص نماییم. خب اجازه دهید این را با یک مثال ساده ببینیم:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public class CollectionInitializer<T> { private T[] collection; public CollectionInitializer(int collectionLength) { collection = new T[collectionLength]; } public void AddElementsToCollection(params T[]elements) { for(int i=0; i<elements.Length; i++) { collection[i] = elements[i]; } } public T[] RetrieveAllElements() { return collection; } public T RetreiveElementOnIndex(int index) { return collection[index]; } } |
و برای استفاده از این کلاس generic:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Program { static void Main(string[] args) { CollectionInitializer<int> initializer = new CollectionInitializer<int>(5); initializer.AddElementsToCollection(5, 8, 12, 74, 13); int[] collection = initializer.RetrieveAllElements(); int number = initializer.RetreiveElementOnIndex(3); foreach (int element in collection) { Console.WriteLine(element); } Console.WriteLine(); Console.WriteLine($"Element on the selected index is: {number}"); Console.ReadKey(); } } |
همانطور که در کلاس CollectionInitializer میبینیم، باید type ای که میخواهیم با آن کار کنیم را تعیین نماییم. سپس میتوانیم متدهای پیاده سازی شده داخل کلاس generic مان را فراخوانی کنیم. البته ما به دلیل سادگی، بررسیهای امنیتی را انجام نداده ایم (اگر عناصر بیشتر از طول آرایه ارسال کنیم و غیره). حالا میتوانیم نتیجه را ببینیم:
یک کلاس generic، میتواند بیشتر از یک پارامتر type داشته باشد:
1 |
public class CollectionKeyValueInitializer<TKey, TValue> |
محدودیتهای با Generic ها
برخی اوقات، ما میخواهیم اطمینان حاصل کنیم که فقط نوعهای خاصی میتواند با کلاس generic ما فراخوانی شود. این امکان در حالیکه با کلاسها یا اینترفیسها کار میکنیم اغلب میتواند مفید باشد. ما میتوانیم این کار را با استفاده از کلمه where انجام دهیم:
1 |
public class CollectionInitializer<T> where T: Student |
یا ما میتوانیم کلاس generic مان را فقط برای کار با کلاسها محدود کنیم:
1 |
public class CollectionInitializer<T> where T: class |
انواع مختلفی برای این محدودیتها وجود دارد. آنها به موقعیتهایی که در آن کار میکنیم وابسته هستند. مهم است که بدانیم که اگر ما کلاس generic مان را فقط محدود به کلاسها میکنیم و سپس هنگام استفاده از این کلاس، اگر یک value type ارائه دهیم آنگاه با خطا مواجه خواهیم شد. همچنین اگر میخواهیم فقط با value type ها کار کنیم، آنگاه میتوانیم کلاس generic مان را به این صورت محدود کنیم:
1 |
public class CollectionInitializer<T> where T: struct |
متدهای Generic
به همین ترتیب که میتوانیم یک کلاس generic ایجاد کنیم، یک متد generic نیز میتوانیم ایجاد کنیم. فقط باید یک پارامتر type بین دو علامت کوچکتر و بزرگتر در جلوی نام متد ست کنیم:
1 2 3 4 |
public void ExampleMethod<T>(T param1, T param2) { //Methods body } |
اگر متد generic ما داخل یک کلاس generic وجود دارد، آنگاه باید به شناسه پارامتر type توجه کنیم. اگر آن کلاس یک type به نام T دارد، سپس متد ما باید یک نوع متفاوت (U, Y, R…) داشته باشد، در غیر اینصورت T type آن متد، T type کلاس را مخفی میکند.
نتیجه گیری
در این مقاله ما یاد گرفتیم که:
- چطور از generic ها در #C استفاده کنیم
- چطور محدودیتها را در کلاسهای generic مان پیاده سازی کنیم
- چطور متدهای generic ایجاد کنیم
در مقاله بعدی، در مورد Stack،Queue و Hashtable در #C صحبت میکنیم.