الأنواع (دليل البرمجة لـ #C)

الأنواع والمتغيرات والقيم

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

يمكن أن تتضمن المعلومات المخزنة في نوع ما يلي:

  • مساحة التخزين التي يتطلبها المتغير.

  • الحد الأقصى والحد الأدنى للقيم التي يمكن أن يمثلها.

  • الأعضاء (الأساليب والحقول والأحداث وإلخ) التي يحتويها.

  • النوع الأساسي الذي ترث منه.

  • الموقع الذي يتم تخصيصه في الذاكرة للمتغيرات في وقت التشغيل.

  • أنواع العمليات المسموح بها.

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

int a = 5;             
int b = a + 2; //OK

bool test = true;

// Error. Operator '+' cannot be applied to operands of type 'int' and 'bool'.
int c = a + test;

ملاحظة

مطورو C و ++C، لاحظو أنه في #C، لا يمكن تحويل bool إلى int.

يضمّن المحول البرمجي معلومات النوع في الملف التنفيذي كبيانات التعريف. وقت تشغيل اللغة العامة (CLR) يستخدم بيانات التعريف هذه في وقت التشغيل ليضمن أمان النوع عند تخصيص وإعادة الذاكرة.

تحديد الأنواع في تعريف المتغيرات

عندما تقوم بتعريف متغير أو ثابت في برنامج يجب عليك إما تحديد نوعه أو استخدام الكلمة الأساسية var للسماح للمحول البرمجي على الاستدلال على النوع. يظهر المثال التالي بعض تعريفات المتغير التي تستخدم كلا من الأنواع الرقمية المضمنة والأنواع المعرفة من قبل المستخدم المعقدة:

// Declaration only:
float temperature;
string name;
MyClass myClass;

// Declaration with initializers (four examples):
char firstLetter = 'C';
var limit = 3;
int[] source = { 0, 1, 2, 3, 4, 5 };
var query = from item in source
            where item <= limit
            select item;

أنواع معلمات الأسلوب وقيم الإرجاع يتم تحديدها في توقيع الأسلوب. يظهر التوقيع التالي أسلوب يتطلب int كوسيطة إدخال ويرجع سلسلة حرفية:

public string GetName(int ID)
{
    if (ID < names.Length)
        return names[ID];
    else
        return String.Empty;
}
private string[] names = { "Spencer", "Sally", "Doug" };

بعد أن يتم التصريح عن متغير لا يمكن إعادة تعريفه بنوع جديد ولا يمكن تعيين قيمة غير متوافقة مع نوعه المُعلَن. على سبيل المثال، لا يمكنك تعريف int ثم تعيين القيمة المنطقية true له. ومع ذلك، يمكن تحويل القيم إلى أنواع أخرى على سبيل المثال عندما يتم تعيينها لمتغيرات جديدة أو عندما يتم تمريرها كوسيطات للأسلوب. تحويل النوع الذي لا يتسبب في فقدان بيانات يتم تنفيذه تلقائياً من قبل المحول البرمجي. يتطلب التحويل الذي قد يتسبب في فقدان بيانات تحويل (cast) في التعليمات البرمجية للمصدر.

لمزيد من المعلومات، راجع النوع وتحويلات نوع (البرمجة C# إرشادات).

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

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

الأنواع المخصصة

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

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

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

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

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

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

أنواع القيمة وأنواع المرجع في CTS

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

ملاحظة

يمكنك مشاهدة أن الأنواع الأكثر استخداماً منظمة في مساحة الاسم System. ومع ذلك، مساحة الاسم المحتوية على النوع ليس لديها علاقة إلى ما إذا كان نوع قيمة أو نوع مرجع.

أنواع القيم

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

توجد فئتان من نوع القيمة: struct و enum.

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

// Static method on type Byte.
byte b = Byte.MaxValue;

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

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

أنواع القيم مغلقة، مما يعني على سبيل المثال، لا يمكنك اشتقاق نوع من System.Int32، ولا يمكنك تعريف بنية لترث من أية فئة معرفة من قبل المستخدم أو بنية لأن البنية يمكنها فقط أن ترث من System.ValueType. ومع ذلك، يمكن للبنية تطبيق واجهة واحدة أو أكثر. يمكنك تحويل نوع بنية إلى نوع واجهة، يؤدي هذا إلى عملية تحويل إلى كائن (boxing) للالتفاف حول البنية داخل كائن ذو نوع مرجع في كومة الذاكرة المؤقتة المدارة. تحدث عمليات التحويل إلى كائن (boxing) عند تمرير نوع قيمة إلى أسلوب يأخذ System.Object كمعلمة إدخال. لمزيد من المعلومات، راجع التحويل إلى كائن والتحويل إلى نوع القيمة (دليل البرمجة لـ C#).

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

public struct CoOrds
{
    public int x, y;

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

لمزيد من المعلومات حول البنيات، انظر البنيات (دليل البرمجة لـ #C). للحصول على معلومات أكثر حول أنواع القيم في .NET Framework، راجع نظام نوع شائع.

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

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

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

كل التعدادات ترث من System.Enum ، والتي ترث من System.ValueType. جميع القوانين التي تنطبق على البنيات تنطبق على التعداد. لمزيد من المعلومات حول التعدادات، انظر أنواع قائمة التعداد (إرشادات برمجة C#).

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

النوع الذي يتم تعريفه كـ class، delegate، array، أو interface يكون نوع مرجع. وقت التشغيل عند التصريح عن متغيّر من نوع مرجع يحتوي المتغير على القيمة null حتى يتم إنشاء مثيل من الكائن بوضوح باستخدام عامل التشغيل new، أو تعيينها لكائن تم إنشاؤه في مكان آخر باستخدام new, as shown in the following example:

MyClass mc = new MyClass();
MyClass mc2 = mc;

يجب تهيئة الواجهة مع كائن الفئة الذي يطبقه. إذا كان MyClass يطبّق IMyInterface، تقوم بإنشاء مثيل من IMyInterface كما هو موضح في المثال التالي:

IMyInterface iface = new MyClass();

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

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

// Declare and initialize an array of integers.
int[] nums = { 1, 2, 3, 4, 5 };

// Access an instance property of System.Array.
int len = nums.Length;

أنواع المرجع تعتمد الوراثة بشكل كامل. عند إنشاء فئة يمكنك الوراثة من أي واجهة أخرى أو فئة لم يتم تعريفها كـ مغلقة والفئات الأخرى يمكها أن ترث من الفئة الخاصة بك وتجاوز الأساليب الظاهرية. للحصول على معلومات أكثر حول كيفية إنشاء فئات خاصة بك، راجع الفئات والبنيات (دليل البرمجة لـ #C): للحصول على معلومات أكثر حول الوراثة والاساليب الظاهرية، راجع الوراثة (دليل البرمجة لـ #C).

أنواع القيم الحرفية

في #C، القيم الحرفية تلقي النوع من المحول البرمجي. يمكنك تحديد كيفية اختيار نوع القيمة الحرفية عن طريق إلحاقه بحرف إنهاء الرقم. على سبيل المثال، لتحديد أن يجب التعامل مع القيمة 4.56 على أنها float قم بإلحاق "f" أو "F" بعد الرقم: 4.56f. إذا لم يتم إلحاق حرف سيقوم المحول البرمجي بالاستدلال على النوع الحرفي. لمزيد من المعلومات حول كيفية تحديد الأنواع مع الأحرف اللاحقة، راجع صفحات المرجع للأنواع الفردية في أنواع القيم وأنواع المراجع.

لأنه القيم الحرفية تكون ذات نوع وجميع الأنواع مشتقة بالنهاية من System.Object، يمكنك كتابة وترجمة التعليمات البرمجية كالتالي:

string s = "The answer is " + 5.ToString();
// Outputs: "The answer is 5"
Console.WriteLine(s);

Type type = 12345.GetType();
// Outputs: "System.Int32"
Console.WriteLine(type);

أنواع عامة

يمكن أن يتم تعريف النوع مع معلمة نوع واحدة أو أكثر الذي يعمل كعنصر نائب للنوع الفعلي (النوع الملموس) الذي توفره التعليمات البرمجية للعميل عند إنشاء مثيل من نوع. تسمى هذه الأنواع أنواع عامة. على سبيل المثال، لدى نوع .NET Framework System.Collections.Generic.List<T> معلمة نوع واحدة التي بواسطة الاصطلاح يتم إعطاؤها اسم T. عند إنشاء مثيل من نوع تقوم بتحديد نوع الكائنات التي ستحتويها القائمة على سبيل المثال، السلسلة الحرفية:

List<string> strings = new List<string>();

استخدام معلمة النوع يجعل من الممكن إعادة استخدام نفس الفئة للاحتفاظ في أي نوع من العناصر دون الحاجة إلى تحويل كل عنصر إلى object. تسمى فئات المجموعات العامة مجموعات ذات نوع صارم لأن المحول البرمجي يعرف النوع المحدد لعناصر المجموعة ويمكن رفع خطأ وقت الترجمة إذا كنت على سبيل المثال، تحاول إضافة عدداً إلى الكائن strings في المثال السابق. لمزيد من المعلومات، راجع عام (إرشادات برمجة C#).

الأنواع الضمنية والأنواع المجهولة والأنوع التي تقبل القيم الخالية

كما هو مذكور مسبقاً، يمكنك وضع نوع لمتغير محلي ضمنيًا (لكن ليس أعضاء الفئة) باستخدام الكلمة الأساسية var. لا يزال المتغير يتلقى نوع في وقت التحويل البرمجي ولكن يتم توفير النوع من قبل المحول البرمجي. لمزيد من المعلومات، راجع المتغيرات المحلية ذات النوع المُختار ضمنياً (دليل البرمجة لـ #C).

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

لا يمكن أن تحتوي أنواع القيم العادية القيمة null. ومع ذلك، يمكنك إنشاء أنواع قيمة تقبل القيم الخالية بواسطة لصق ? بعد النوع. على سبيل المثال، int? هو نوع int ولكن يمكن أن يحتوي على القيمة null. في CTS الأنواع التي تقبل القيم الخالية عبارة عن مثيلات لنوع البنية العام System.Nullable<T>. الأنواع التي تقبل القيم الخالية مفيدة على وجه الخصوص عندما تقوم بتمرير بيانات من وإلى قواعد البيانات التي يمكن فيها أن تكون القيم الرقمية null. لمزيد من المعلومات، راجع الأنواع ذات القيم الخالية (دليل البرمجة لـ #C).

الأقسام ذات الصلة

لمزيد من المعلومات، راجع المواضيع التالية:

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

راجع أيضًا:

المرجع

مقارنة أنواع البيانات بلغات متعددة

جدول الأنواع المتكاملة (مرجع C#)

المبادئ

دليل البرمجة لـ #C

Conversion of XML Data Types

موارد أخرى

مرجع C#‎