English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي C#

دليل متقدم C#

C# موجه بالأشياء(OOP)

التصنيف في C#

الجينية تعني الشكل العام وليس الشكل المحدد. في C#، الجينية تعني عدم التخصص في نوع بيانات محدد.

يُسمح لك بلغة C# باستخدام معلمات النوع دون استخدام نوع بيانات محدد لتحديد الفئات الجينية، والواجهات، والفئات التجريبية، الحقول، والطرق، والطرق الثابتة، والخصائص، والأحداث، والأدوات، والعمليات. هي معلمة النوع هي مُوضع للنوع المحدد عند إنشاء مثال على النوع الجيني.

يُعلن الجينية من خلال تحديد معلمة النوع في التكعيب بعد اسم النوع، مثل TypeName<T>، هنا T هي معلمة النوع.

الفئات الجينية

تُعرف الفئات الجينية باستخدام معلمات النوع في التكعيب بعد اسم الفئة. في هذا المثال، تم تعريف فئة جينية.

class DataStore<T>
{
    public T Data { get; set; }
}

في النص السابق، DataStore هي فئة جينية. T تُدعى معلمة النوع، وتُستخدم كمعلمة النوع في الحقول، والخصائص، ومتغيرات الدخول، والمخرجات، والأدوات في فئة DataStore.

ملاحظة: عادةً، يمكن استخدام T عند وجود معلمة نوع واحدة. عند وجود أكثر من معلمة نوع، لا تستخدم T كمعلمة نوع، يمكنك تحديد أي اسم للمعلمة النوع. يُنصح باستخدام أسماء معلمات النوع القابلة للقراءة بشكل أفضل، مثل TSession،TKey،TValue وما إلى ذلك.

يمكنك أيضًا تعريف أنواع متعددة من معلمات النوع، وتمييزها بفاصلة محورية.

class KeyValuePair<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

تحديد الفئة الجينية

يمكنك إنشاء مثال على الفئة الجينية من خلال تحديد النوع الفعلي في التكعيب. في هذا المثال، يتم إنشاء مثال على الفئة الجينية DataStore.

DataStore<string> store = new DataStore<string>();

في النص السابق، قمنا في إنشاء المثال باستخدام التكعيب للتحديد النوع. لذلك، سيتم استبدال T عند التجميع في أي نوع T يستخدم في كامل الفئة. لذلك، نوع خاصية Data هو T.

下图说明了泛型的工作方式。

您可以为Data属性分配一个字符串值。尝试分配除字符串以外的其他值将导致编译时错误。

DataStore<string> store = new DataStore<string>();
store.Data = "Hello World!"; // obj.Data = 123; //编译时错误

您可以为不同的对象指定不同的数据类型,如下所示。

DataStore<string> strStore = new DataStore<string>();
strStore.Data = "Hello World!";
//strStore.Data = 123; // 编译时错误
DataStore<int> intStore = new DataStore<int>();
intStore.Data = 100;
//intStore.Data = "Hello World!"; // 编译时错误
KeyValuePair<int, string> kvp1 = new KeyValuePair<int, string>();
kvp1.Key = 100;
kvp1.Value = "Hundred";
KeyValuePair<string, string> kvp2 = new KeyValuePair<string, string>();
kvp2.Key = "IT";
kvp2.Value = "Information Technology";

泛型类特征

  • 泛型类增加了可重用性。类型越多,可重用性就越高。然而,过多的泛化会使代码难以理解和维护。

  • 泛型类可以是其他泛型或非泛型类或抽象类的基类。

  • 泛型类可以派生自其他泛型或非泛型接口,类或抽象类。

泛型字段

泛型类可以包含泛型字段。但是,无法初始化。

class DataStore<T>
{
    public T data;
}

下面声明一个泛型数组。

class DataStore<T>
{
    public T[] data = new T[10];
}

泛型方法

使用类型参数声明其返回类型或参数的方法称为泛型方法。

class DataStore<T>
{
    private T[] _data = new T[10];
    
    public void AddOrUpdate(int index, T item)
    {
        if(index >= 0 && index < 10)
            _data[index] = item;
    }
    public T GetData(int index)
    {
        if(index >= 0 && index < 10)
            return _data[index];
        else 
            return default(T);
    }
}

طريقة AddorUpdate() و GetData() المذكورة أعلاه هي طرق عامة.

DataStore<string> cities = new DataStore<string>();
cities.AddOrUpdate(0, "Mumbai");
cities.AddOrUpdate(1, "Chicago");
cities.AddOrUpdate(2, "London");
DataStore<int> empIds = new DataStore<int>();
empIds.AddOrUpdate(0, 50);
empIds.AddOrUpdate(1, 65);
empIds.AddOrUpdate(2, 89);

يمكن استخدام معرفات النوع العامة مع عدة متغيرات مع أو بدون متغيرات غير عامة ونوع العودة. إليك بعض التحميلات العامة الصالحة.

public void AddOrUpdate(int index, T data) { }
public void AddOrUpdate(T data1, T data2) { }
public void AddOrUpdate<U>(T data1, U data2) { }
public void AddOrUpdate(T data) { }

من خلال تحديد معرف النوع باستخدام اسم الطريقة داخل البارزات، يمكن للفئات غير العامة أن تحتوي على طرق عامة، مثل ما يلي.

class Printer
{
    public void Print<T>(T data)
    {
        Console.WriteLine(data);
    }
}
printer printer = new printer();
printer.Print<int>(100);
printer.Print(200); // يتم التكهن بناءً على القيمة المحددة
printer.Print<string>("Hello");
printer.Print("World!"); // يتم التكهن بناءً على القيمة المحددة

مزايا التصنيف الأصلي

  1. يزيد التصنيف الأصلي من إعادة استخدام الكود. لا تحتاج إلى كتابة كود لتعامل أنواع البيانات المختلفة.

  2. التصنيف الأصلي آمن من الناحية النوعية. إذا حاول استخدام نوع بيانات مختلف عن الذي تم تحديده في التعريف، فإنه سيظهر خطأ في وقت التجميع.

  3. يتمتع التصنيف الأصلي بميزة الأداء لأنه يزيل إمكانية التعبئة والتشغيل.