سؤال

افترض الرمز التالي ، دون أي ref الكلمة الرئيسية ، من الواضح أنها لن تحل محل المتغير الذي تم تمريره ، حيث تم تمريره كقيمة.

class ProgramInt
{
    public static void Test(int i) // Pass by Value
    {
        i = 2; // Working on copy.
    }

    static void Main(string[] args)
    {
        int i = 1;
        ProgramInt.Test(i);
        Console.WriteLine(i);
        Console.Read();

        // Output: 1
    }
}

الآن أن تعمل هذه الوظيفة كما هو متوقع ، يمكن للمرء أن يضيف ref الكلمة الرئيسية كالمعتاد:

class ProgramIntRef
{
    public static void Test(ref int i) // Pass by Reference
    {
        i = 2; // Working on reference.
    }

    static void Main(string[] args)
    {
        int i = 1;
        ProgramInt.Test(ref i);
        Console.WriteLine(i);
        Console.Read();

        // Output: 2
    }
}

أنا الآن في حيرة من السبب في أن أعضاء الصفيف عند تمريره في الوظائف يتم تمريره ضمنيًا بالرجوع إليه. ليست أنواع القيمة المصفوفات؟

class ProgramIntArray
{
    public static void Test(int[] ia) // Pass by Value
    {
        ia[0] = 2; // Working as reference?
    }

    static void Main(string[] args)
    {
        int[] test = new int[] { 1 };
        ProgramIntArray.Test(test);
        Console.WriteLine(test[0]);
        Console.Read();

        // Output: 2
    }
}
هل كانت مفيدة؟

المحلول

لا ، الصفائف هي فصول ، مما يعني أنها أنواع مرجعية.

نصائح أخرى

لا يتم تمرير المصفوفات بالرجوع إليها. يتم تمرير المراجع إلى المصفوفات حسب القيمة. إذا كان من الضروري تغيير ما هو صفيف متغير الصفيف الذي تم تمريره إلى (على سبيل المثال لتغيير حجم الصفيف) ، يجب تمرير المتغير بالرجوع إليه.

طريقة جيدة لتذكر هذا:

  • "المرجع" يجعل الاسم المستعار إلى عامل
  • صفيف هو مجموعة من المتغيرات; ؛ كل عنصر هو متغير.

عندما تمر صفيفًا بشكل طبيعي ، فأنت تمر مجموعة من المتغيرات. لا تتغير المتغيرات في المجموعة.

عندما تمر بصفيف مع "المرجع" فأنت كذلك إعطاء اسم جديد للمتغير الذي يحتوي على الصفيف.

عندما تمرر عنصر صفيف عادة ما تمر القيمة في المتغير.

عندما تمرر عنصر صفيف - متغير - مع "المرجع" ، فأنت كذلك إعطاء اسم جديد لهذا المتغير.

منطقي؟

هل يمكنك أن تتخيل تمرير مجموعة عنصر مليوني عنصر بالقيمة؟ الآن تخيل أن نوع العنصر هو decimal. سيكون عليك النسخ حولها 240 ميجابايت 30.5175781MB من البيانات.

كما أشار مرجع MSDN, ، المصفوفات هي كائنات (System.Array هو النوع الأساسي التجريدي لجميع المصفوفات) ويتم تمرير الكائنات بالرجوع إليها.

بخلاف أنواع البيانات الأساسية ، لا يمكنك تمرير أي شيء آخر كتمرير حسب القيمة ، فالصفيف هو مجموعة من أنواع البيانات الأساسية التي تسمح أيضًا بالتمرير حسب القيمة على التجميع من شأنه أن يخلق نسخًا متعددة من التجميع والتي ستكون سيئة في الأداء.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top