Fady.
كل المقالات
قراءة في 5 دقائق

فهم الـ Generics في C#

تتيح لك الـ Generics كتابة الكود مرة واحدة واستخدامه مع أي نوع — أكثر قابلية لإعادة الاستخدام وأكثر إيجازًا وأمانًا من تمرير كل شيء عبر object.

C#.NETBackend

تتيح لك الـ Generics كتابة كود يعمل مع أي نوع بيانات مع بقائه آمنًا تمامًا من ناحية الأنواع (type-safe). فبدل تكرار دالة لكل نوع — أو تحويل كل شيء عبر object والأمل في الأفضل — تكتبها مرة واحدة مع type parameter. وتعلن هذا الـ parameter بأقواس زاوية: <T>.

دالة generic

هذه دالة تطبع قيمة من أي نوع:

csharp
public static void Print<T>(T value)
{
    Console.WriteLine(value);
}

وهي تعمل مع أي شيء تمرره إليها:

csharp
Print(10);              // 10
Print("Hello, world!"); // Hello, world!

الـ Generic classes

الفكرة نفسها تتسع إلى كلاسات كاملة. يعلن الـ generic class عن type parameter بعد اسم الكلاس — وT مجرد اصطلاح؛ أي اسم يصلح.

csharp
public class Box<T>
{
    private T item;
    public void Put(T value) => item = value;
    public T Get() => item;
}

لماذا نهتم

إعادة الاستخدام — تنفيذ واحد يخدم كل الأنواع. الإيجاز — كود مكرر أقل. الأداء — لا boxing ولا casting عند التعامل مع الـ value types. الأمان — يفرض المترجم (compiler) النوع الصحيح، فتختفي فئة كاملة من أخطاء وقت التشغيل.

أنت تستخدمها بالفعل

معظم collections في .NET هي generic: List<T> (قائمة قابلة لتغيير الحجم)، وDictionary<TKey, TValue> (أزواج اسم/قيمة)، وQueue<T> (FIFO)، وStack<T> (LIFO)، وComparer<T>. في كل مرة تكتب List<string> فأنت تستخدم الـ generics.

الـ Generics من أهم ميزات C#. سواء في دالة أو كلاس، فهي الطريقة التي تكتب بها كودًا مرنًا وقابلًا لإعادة الاستخدام دون التخلي عن شبكة أمان المترجم.


بقلم فادي إيهاب عامر

راسلني على واتساب

تابع القراءة