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

دليل أساسي C#

دليل متقدم C#

C# موجه بالأ象ص (OOP)

نوع القيمة و النوع المرفق C#

في C#، يتم تصنيف هذه الأنواع بناءً على كيفية تخزينها للقيم في الذاكرة. تشمل C# الفئات التالية من أنواع البيانات:

  1. أنواع القيمة

  2. أنواع المشاركة

  3. أنواع الإشارة

أنواع القيمة

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

جميع أنواع القيمة تنتسب إلىSystem.ValueTypeبجنس، وSystem.ValueTypeومرة أخرى منSystem.Objectبجنس

مثلاً، متغير كامل int i = 100;

يخزن النظام 100 في مساحة الذاكرة المخصصة للمتغير i. يوضح الشكل أدناه كيف يتم تخزين 100 في موقع افتراضي في ذاكرة 'i' (0x239110):

تخصيص ذاكرة النوع القيمة

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

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • struct

  • uint

  • ulong

  • ushort

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

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

static void ChangeValue(int x)
{
    x = 200;
    Console.WriteLine(x);
}
static void Main(string[] args)
{
    int i = 100;
    Console.WriteLine(i);
    
    ChangeValue(i);
    
    Console.WriteLine(i);
}
الإخراج:

100
200
100

في المثال السابق، حتى بعد نقل متغير i من دالة Main() إلى دالة ChangeValue() وتغيير قيمته، فإنه يظل ثابتًا.

أنواع المشاركة

على عكس الأنواع القيمية، لا تخزن الأنواع المشاركة القيمة مباشرة. بدلاً من ذلك، تخزن عنوان الذاكرة للعنصر الذي يحتوي على القيمة. بمعنى آخر، تحتوي الأنواع المشاركة على إشارة إلى موقع آخر يحتوي على البيانات.

على سبيل المثال، النصوص المتالية:

string s = "Hello World!!";

يُظهر الشكل التالي كيفية تخصيص النظام للذاكرة لـ متغير النصوص المذكور أعلاه.

تخصيص الذاكرة للمتغيرات المشاركة

كما يُظهر الشكل أعلاه، يختار النظام موقعًا عشوائيًا في الذاكرة للمتغير s (0x803200). قيمة المتغير s هي 0x600000، وهي عنوان الذاكرة للقيمة الفعلية. لذلك، يُخزن النوع المشارك عنوان الذاكرة للقيمة الفعلية بدلاً من القيمة نفسها.

هذه هي أنواع البيانات المشاركة:

  • النصوص

  • القوائم (حتى إذا كانت عناصرها أنواع قيمية)

  • فئات

  • مكتبات

نقل متغيرات النوع المشارك

عندما تنقل متغيرات النوع المشارك من دالة إلى أخرى، فإنها لا تخلق نسخة جديدة؛ بدلاً من ذلك، تُرسل عنوان الذاكرة للمتغير. لذلك، إذا غيرت قيمة المتغير في الدالة، فإن التغيير سيُظهر أيضًا في الدالة التي تم استدعاؤها.

static void ChangeReferenceType(Student std2)
{
    std2.StudentName = "Steve";
}
static void Main(string[] args)
{
    Student std1 = new Student();
    std1.StudentName = "Bill";
    
    ChangeReferenceType(std1);
    Console.WriteLine(std1.StudentName);
}
الإخراج:
Steve

في المثال السابق، سنقوم بتحويل عميل Student std1 إلى دالة ChangeReferenceType() هنا، يُرسل في الواقع عنوان الذاكرة لـ std1. لذلك، عندما يغير دالة ChangeReferenceType() StudentName، فإنه يغير في الواقع StudentName لـ std1 لأن std1 و std2 يشيران إلى نفس العنوان في الذاكرة.

قيمة نول

  القيمة الافتراضية للنول هي غير المُبني عند عدم التخصيص. النول يعني عدم إشارة إلى أي عنصر.

نوع الإشارة العدمية

لا يمكن أن تكون متغيرات القيمة النوعية نول، لأنها تُخزن القيمة وليس عنوان الذاكرة. تم إدخال النوع القابل للنول في C# 2.0، مما يسمح بتعيين نول أو إعلان متغيرات القيمة النوعية دون تخصيصها قيمة.