0Pricing
C# Academy · درس

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

تعرّفوا على كيفية تخزين كل نوع ونسخه

أنواع القيم مقابل أنواع المراجع درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

عائلتا الأنواع

تنقسم أنواع C# إلى أنواع قيمة مثل int وdouble وbool وstructs، وأنواع مرجعية مثل الأصناف والسلاسل النصية والمصفوفات. وهي تختلف في طريقة تخزينها ونسخها.

using System;

class Program
{
    static void Main()
    {
        int valueType = 5;          // value type
        int[] referenceType = { 1, 2, 3 };  // reference type
        Console.WriteLine(valueType + ", length " + referenceType.Length);
    }
}

أنواع القيمة تحتفظ بالبيانات

يحتوي متغير نوع القيمة على بياناته مباشرةً. وتُخزَّن هذه القيم عادةً في المكدس أو مضمنةً داخل الكائن الحاوي لها.

using System;

class Program
{
    static void Main()
    {
        int a = 10;
        double b = 3.14;
        bool c = true;
        Console.WriteLine(a + ", " + b + ", " + c);
    }
}

الأنواع المرجعية تحتفظ بعنوان

يحتوي متغير النوع المرجعي على مرجع، أي عنوان، للبيانات المخزنة في الكومة. ويكون المتغير والكائن منفصلين.

using System;

class Box { public int Value; }

class Program
{
    static void Main()
    {
        Box b = new Box();   // b refers to a heap object
        b.Value = 42;
        Console.WriteLine(b.Value);
    }
}

دلالات النسخ: أنواع القيمة

يؤدي إسناد نوع قيمة إلى نسخ البيانات. ولا يؤثر تغيير النسخة في الأصل مطلقًا.

using System;

class Program
{
    static void Main()
    {
        int a = 1;
        int b = a;   // copy
        b = 99;
        Console.WriteLine("a=" + a + ", b=" + b);
    }
}

دلالات النسخ: أنواع المرجع

يؤدي إسناد نوع مرجعي إلى نسخ المرجع، وليس الكائن. بعد ذلك يشير المتغيران إلى الكائن نفسه.

using System;

class Box { public int Value; }

class Program
{
    static void Main()
    {
        Box a = new Box { Value = 1 };
        Box b = a;   // same object
        b.Value = 99;
        Console.WriteLine("a.Value=" + a.Value + ", b.Value=" + b.Value);
    }
}

البُنى أنواع قيمة

إن struct الذي تعرّفونه هو نوع قيمة، ولذلك يُنسخ عند الإسناد مثل int تمامًا.

using System;

struct Point { public int X, Y; }

class Program
{
    static void Main()
    {
        Point p1 = new Point { X = 1, Y = 2 };
        Point p2 = p1;   // full copy
        p2.X = 99;
        Console.WriteLine("p1.X=" + p1.X + ", p2.X=" + p2.X);
    }
}

تمرير القيم إلى الأساليب

بشكل افتراضي، تُمرَّر أنواع القيم بالنسخ، بينما تمرّر أنواع المرجع نسخة من المرجع. لذلك يستطيع الأسلوب تغيير كائن من فئة يراه المستدعي، لكنه لا يستطيع تغيير قيمة int عادية.

using System;

class Counter { public int N; }

class Program
{
    static void BumpInt(int x) { x++; }
    static void BumpObj(Counter c) { c.N++; }

    static void Main()
    {
        int i = 0;
        BumpInt(i);
        var c = new Counter();
        BumpObj(c);
        Console.WriteLine("i=" + i + ", c.N=" + c.N);
    }
}

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

يمكن لأنواع المرجع وحدها أن تكون null (أي لا يوجد كائن). أما أنواع القيم فتحمل دائمًا قيمة، ما لم تُعلن كأنواع تقبل null باستخدام ?.

using System;

class Program
{
    static void Main()
    {
        string text = null;        // reference type can be null
        int? maybe = null;          // nullable value type
        Console.WriteLine((text == null) + ", " + (maybe == null));
    }
}

اختلافات المساواة

بالنسبة إلى أنواع القيم، تقارن == البيانات. أما بالنسبة إلى أنواع المرجع، فعادةً ما تقارن == الهوية (أي الكائن نفسه)، ما لم تتم إعادة تعريفها.

using System;

class Program
{
    static void Main()
    {
        int a = 5, b = 5;
        Console.WriteLine("ints: " + (a == b));   // True - same value

        object o1 = new object();
        object o2 = new object();
        Console.WriteLine("objects: " + (o1 == o2));   // False - different identity
    }
}

القيم الافتراضية

لأنواع القيم قيمة افتراضية شبيهة بالصفر (0 أو false)، بينما تكون القيمة الافتراضية لأنواع المرجع هي null.

using System;

class Program
{
    static void Main()
    {
        int defaultInt = default;
        bool defaultBool = default;
        string defaultString = default;
        Console.WriteLine(defaultInt + ", " + defaultBool + ", null? " + (defaultString == null));
    }
}

جمع المفاهيم

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

using System;

struct Money { public decimal Amount; }
class Wallet { public decimal Amount; }

class Program
{
    static void Main()
    {
        Money m1 = new Money { Amount = 10 };
        Money m2 = m1; m2.Amount = 99;

        Wallet w1 = new Wallet { Amount = 10 };
        Wallet w2 = w1; w2.Amount = 99;

        Console.WriteLine("Money copy: " + m1.Amount + " (independent)");
        Console.WriteLine("Wallet ref: " + w1.Amount + " (shared)");
    }
}

اختبار سريع

اختبروا مدى فهمكم لأنواع القيم وأنواع المرجع.

مراجعة

تخزّن أنواع القيم (int وdouble وbool والبُنى) البيانات مباشرةً وتُنسخ عند الإسناد، بينما تخزّن أنواع المرجع (الفئات والسلاسل النصية والمصفوفات) مرجعًا إلى كائن في الكومة، وتنسخ المرجع. وتقبل أنواع المرجع وحدها قيمة null افتراضيًا، كما يختلف سلوك الإسناد والمساواة بين العائلتين.

using System;

struct V { public int N; }
class R { public int N; }

class Program
{
    static void Main()
    {
        V v1 = new V { N = 1 }; V v2 = v1; v2.N = 9;
        R r1 = new R { N = 1 }; R r2 = r1; r2.N = 9;
        Console.WriteLine(v1.N + " vs " + r1.N);
    }
}

الأسئلة الشائعة

هل درس «أنواع القيم مقابل أنواع المراجع» مجاني؟

نعم — نص درس «أنواع القيم مقابل أنواع المراجع» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «أنواع القيم مقابل أنواع المراجع»؟

تعرّفوا على كيفية تخزين كل نوع ونسخه تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «أنواع القيم مقابل أنواع المراجع»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أنواع القيم مقابل أنواع المراجع
  2. التغليف وفك التغليف
  3. التحويلات الضمنية والصريحة
  4. الفئة Convert والتحليل
← العودة إلى C# Academy