فحص نظام نوع .NET

مكتمل

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

الأنواع المضمنة

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

أنواع مخصصة

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

نظام النوع الشائع

من المهم فهم نقطتين أساسيتين حول نظام النوع في .NET:

  • وهو يدعم مبدأ الإرث. يمكن اشتقاق الأنواع من أنواع أخرى، تسمى الأنواع الأساسية. يرث النوع المشتق (مع بعض القيود) الأساليب والخصائص والأعضاء الآخرين من النوع الأساسي. يمكن أن يستمد النوع الأساسي بدوره من نوع آخر، وفي هذه الحالة يرث النوع المشتق أعضاء كلا النوعين الأساسيين في التسلسل الهرمي للتوريث الخاص به. جميع الأنواع، بما في ذلك الأنواع الرقمية المضمنة مثل System.Int32 (الكلمة الأساسية C#: int)، مشتقة في النهاية من نوع أساسي واحد، وهو System.Object (الكلمة الأساسية C#: object). يسمى هذا التسلسل الهرمي للنوع الموحد نظام النوع المشترك (CTS).

  • يتم تعريف كل نوع في CTS على أنه إما نوع قيمة أو نوع مرجع. تتضمن هذه الأنواع جميع الأنواع المخصصة في مكتبة فئات .NET وكذلك الأنواع المعرفة من قبل المستخدم. الأنواع التي تقوم بتعريفها باستخدام الكلمة الأساسية للبنية هي أنواع قيم؛ جميع الأنواع الرقمية المضمنة هي بنيات. الأنواع التي تقوم بتعريفها باستخدام الكلمة الأساسية للفئة أو السجل هي أنواع مرجعية. تحتوي أنواع المراجع وأنواع القيم على قواعد مختلفة لوقت التحويل البرمجي وسلوك مختلف لوقت التشغيل.

يوضح الرسم التوضيحي التالي العلاقة بين أنواع القيم وأنواع المراجع في CTS.

رسم تخطيطي يعرض أنواع القيم والمراجع.

الفئات والبنيات هي اثنين من البنيات الأساسية لنظام النوع الشائع في .NET. كل منها هو في الأساس بنية بيانات تغلف مجموعة من البيانات والسلوكيات التي تنتمي معا كوحدة منطقية. البيانات والسلوكيات هي أعضاء classأو structأو record. يتضمن أعضاء الفئة الخصائص (البيانات) والأساليب (السلوكيات) والحقول (المتغيرات المعلنة داخل الفئة) وغيرها الكثير.

يشبه إعلان classأو structأو record مخططا يستخدم لإنشاء مثيلات أو كائنات في وقت التشغيل. إذا قمت بتعريف فئة تسمى Person، Person هو اسم النوع. إذا قمت بتعريف متغير وتهيئته p من نوع Person، يقال p كائن أو مثيل Person. يمكن إنشاء مثيلات متعددة من نفس نوع Person، ويمكن أن يكون لكل مثيل قيم مختلفة في خصائصه وحقوله.

الفئة هي نوع مرجع. عند إنشاء كائن من النوع، يحتفظ المتغير الذي تم تعيين الكائن له بمرجع لتلك الذاكرة فقط. عند تعيين مرجع الكائن إلى متغير جديد، يشير المتغير الجديد إلى الكائن الأصلي. تنعكس التغييرات التي تم إجراؤها من خلال متغير واحد في المتغير الآخر لأنهما يشيران إلى نفس البيانات.

struct هو نوع قيمة. عند إنشاء struct، يحتفظ المتغير الذي تم تعيين struct له بالبيانات الفعلية struct. عند تعيين struct إلى متغير جديد، يتم نسخ قيمة البيانات. لذلك يحتوي المتغير الجديد والمتغير الأصلي على نسختين منفصلتين من نفس البيانات. لا تؤثر التغييرات التي تم إجراؤها على نسخة واحدة على النسخة الأخرى.

يمكن أن تكون أنواع السجلات إما أنواع مرجعية (record class) أو أنواع قيم (record struct). تحتوي أنواع السجلات على أساليب تدعم المساواة في القيمة.

بشكل عام، تستخدم الفئات لنمذجة سلوك أكثر تعقيدا. تقوم الفئات عادة بتخزين البيانات المراد تعديلها بعد إنشاء كائن فئة. الهياكل هي الأنسب لهياكل البيانات الصغيرة. تقوم البنيات عادة بتخزين البيانات التي لا يقصد تعديلها بعد إنشاء struct. أنواع السجلات هي بنيات بيانات مع أعضاء مجمعين آخرين. عادة ما تقوم السجلات بتخزين البيانات التي لا يقصد تعديلها بعد إنشاء الكائن.

أنواع القيم

أنواع القيم مشتقة من System.ValueType، والتي تستمد من System.Object. الأنواع التي يتم اشتقاقها من System.ValueType لها سلوك خاص في وقت تشغيل اللغة الشائعة. تحتوي متغيرات نوع القيمة مباشرة على قيمها. يتم تخصيص ذاكرة struct مضمنة في أي سياق يتم الإعلان عن المتغير. لا يوجد تخصيص كومة الذاكرة المؤقتة منفصل أو حمل جمع البيانات المهملة لمتغيرات نوع القيمة. يمكنك الإعلان عن أنواع بنية السجلات التي تعد أنواع قيم وتضمين الأعضاء المركبين للسجلات.

هناك فئتان من أنواع القيم: البنية والتعداد.

الأنواع الرقمية المضمنة هي بنيات، وهي تحتوي على حقول وأساليب يمكنك الوصول إليها:


// constant field on type byte.
byte b = byte.MaxValue;

ولكنك تعلن القيم وتعينها لها كما لو أنها أنواع بسيطة غير مجمعة:


byte num = 0xA;
int i = 5;
char c = 'Z';

أنواع القيم مختومة . لا يمكنك اشتقاق نوع من أي نوع قيمة، على سبيل المثال System.Int32. لا يمكنك تعريف struct ترثه من أي class أو struct معرف من قبل المستخدم لأن struct يمكن أن يرث فقط من System.ValueType.

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


public struct Coords
{
    public int x, y;

    public Coords(int p1, int p2)
    {
        x = p1;
        y = p2;
    }
}

الفئة الأخرى من أنواع القيم هي enum. يعرف enum مجموعة من الثوابت المتكاملة المسماة. على سبيل المثال، يحتوي تعداد System.IO.FileMode في مكتبة فئات .NET على مجموعة من الأعداد الصحيحة الثابتة المسماة التي تحدد كيفية فتح ملف. يظهر بناء جملة enum في المثال التالي:


public enum FileMode
{
    CreateNew = 1,
    Create = 2,
    Open = 3,
    OpenOrCreate = 4,
    Truncate = 5,
    Append = 6,
}

الثابت System.IO.FileMode.Create له قيمة 2. ومع ذلك، فإن الاسم أكثر معنى للبشر الذين يقرأون التعليمات البرمجية المصدر، ولهذا السبب من الأفضل استخدام التعدادات بدلا من الأرقام الحرفية الثابتة.

ترث جميع enums من System.Enum، والتي ترث من System.ValueType. تنطبق جميع القواعد التي تنطبق على structs أيضا على enums.

أنواع المراجع

أنواع classrecorddelegatearrayinterface هي أنواع مراجع .

عند الإعلان عن متغير من نوع مرجع، فإنه يحتوي على القيمة null حتى تقوم بتعيينه مع مثيل من هذا النوع أو إنشاء واحد باستخدام عامل التشغيل new.

يوضح المثال التالي كيفية تعريف متغيرات نوع المرجع باستخدام الصفائف:


// Declaring an array variable
int[] numbers;

// Initializing the array with a size of 5
numbers = new int[5];

// Alternatively, declaring and initializing an array in one line
int[] numbers2 = new int[] { 1, 2, 3, 4, 5 };

// Assigning a reference to another variable
int[] numbers3 = numbers2;

يقوم عامل التشغيل new بإنشاء مثيل من النوع وإرجاع مرجع إلى هذا المثيل. المرجع هو عنوان ذاكرة الكائن، ويتم تخزين هذا المرجع في المتغير. عند تعيين متغير نوع مرجع إلى متغير آخر، فإنك تنسخ المرجع، وليس العنصر نفسه. يشير كلا المتغيرين إلى نفس الكائن في الذاكرة.

ملاحظه

بالإضافة إلى كونها أنواع مرجعية، الصفائف هي مجموعات. يمكن تهيئة المجموعات باستخدام تعبيرات المجموعة، ما يلغي متطلبات تضمين الكلمة الأساسية new عند الإعلان عن صفيف وتهيئته في سطر واحد. على سبيل المثال: int[] numbers = [ 1, 2, 3, 4, 5 ];.

يمكنك إنشاء مثيل لفئة باستخدام نفس بناء الجملة المستخدم لإنشاء مثيل للأنووع المضمنة. يوضح المثال التالي كيفية إنشاء مثيل لفئة:


MyClass myClass = new MyClass();
MyClass myClass2 = myClass;

يقوم عامل التشغيل new بإنشاء مثيل للفئة وإرجاع مرجع إلى هذا المثيل. المرجع هو عنوان ذاكرة الكائن، ويتم تخزين هذا المرجع في المتغير. عند تعيين متغير نوع مرجع إلى متغير آخر، فإنك تنسخ المرجع، وليس العنصر نفسه. يشير كلا المتغيرين إلى نفس الكائن في الذاكرة.