السلام عليكــم ورحمـة الله وبركاتــه ،،
هذا الموضوع لتوضيح كيفية عمل generic data type:
أحيانا تحتاج للتعامل مع أي نوع من المتغيرات مثل تخزين البيانات , فكان الحل التقليدي لذلك هو أن تتعامل مع المتغير object فهو يقبل أي نوع من البيانات
ولكن الان اصبح بامكانك أن تتعامل مع متغيرات على حسب ما يريد المستخدم أو المطور
مثال على ذلك في الميثود
class Program
{
static void Main(string[] args)
{
object x = "Hello";
string result = GetObject<string>(x);// لاحظ انT هي string
Console.WriteLine(result);
}
static T GetObject<T>(object obj) // لاحظ صيغة التعريف لذلك
{
return (T)obj;
}
}مثال على ذلك في الكلاس
class Program
{
static void Main(string[] args)
{
// لاحظ ان T هي char
GroupItem<char> group = new GroupItem<char>();
group.AddItem('A');
group.AddItem('B');
group.AddItem('C');
}
}
public class GroupItem<T>// لاحظ صيغة التعريف لذلك
{
private List<T> Items = new List<T>();
/// <summary>
/// return the name at this index
/// </summary>
public T this[int index]
{
get { return Items[index]; }
set { Items[index] = value; }
}
/// <summary>
/// return the index of this name
/// </summary>
public int this[T Item]
{
get { return Items.IndexOf(Item); }
}
public void AddItem(T Item)
{
Items.Add(Item);
}
}استخدام هذه الطريقة يحتم علينا معرفة الكلمة المحجوزة default وتستخدم هذه الكلمة لايجاد القيمة البديهية للنوع المحدد
مثلا للنوع intتكون0 و للنوع double تكون 0.0 وللأنواع ذات القيم المرجعية يكون null
لذلك حينما نستخدم نوع لسنا نعرفه بعد ونحتاج لمعرفة القيمة البديهية لهذا النوع فما علينا إلا أن نكتب الكود التالي
public T this[int index]
{
get
{
if (index > Items.Count|| index<0) return default(T);
else return Items[index];
}
set { Items[index] = value; }
}يوضح هذا المثال احتمال أن يدخل المستخدم index غير موجود فإننا سنقوم بإرجاع القيمة البديهية لهذا النوع
تحديد وتقييد generic data type:
قد تريد من المستخدم أن لا يدخل أي داتا تايب إلا أن تخضع لعدة شروط مثلا أن تكون لها default constructor أو أنها ترث من IDrawable أو أي شرط أخر
فما عليك ألا أن تقوم بتحديد هذه الشروط عند بناءك للكلاس وبالمثال يتضح المقال
الكود الأول
class Program
{
static void Main(string[] args)
{
GroupItem<MyClass> group = new GroupItem<MyClass>();
}
public class GroupItem<T> where T : new()//لاحظ الشرط المحدد
{
}
public class MyClass
{
}
}الكود الثاني :
class Program
{
static void Main(string[] args)
{
GroupItem<MyClass> group = new GroupItem<MyClass>();
}
public class GroupItem<T> where T : new()
{
}
public class MyClass
{
public MyClass(int x)
{
}
}}سنلاحظ أن الكود الثاني يعاني من الأخطاء وذلك لأننا وضعنا شرط أن يحتوي الكلاس على default constructor وذلك في الجملة where T : new()
جملة التحديد****************************المعنى لها
where T : new()*********************يجب أن يكون له T default constructor
where T : class ********************يجب أن يكون T من نوع reference pass by
where T : struct ********************يجب أن يكون T من نوع pass by value
where T : <Name of base class>*******تحديد اسم ال base مباشرة
مثال أخر
class Program
{
static void Main(string[] args)
{
GroupItem<int> group = new GroupItem<int>();
}
public class GroupItem<T> where T : struct
{
}
}