تمرير معلمات نوع القيمة (إرشادات برمجة C#)

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

مثال

يوضح المثال التالي تمرير معلمات نوع القيمة حسب القيمة. المتغير n يتم تمريره حسب قيمة لأسلوب SquareIt. أية تغييرات تحدث داخل أسلوب لديك لا تؤثر على القيمة المتغير الأصلي.

class PassingValByVal
{
    static void SquareIt(int x)
    // The parameter x is passed by value.
    // Changes to x will not affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(n);  // Passing the variable by value.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 5
*/

المتغير n، يكون نوع قيمة يحتوي على بياناته الخاصة, و قيمته 5. عندما يتم استدعاء SquareIt فإن محتويات n يتم نسخها في معلمة x، والتي يتم تربيعها داخل الأسلوب. في Main، على الرغم من ذلك، فإن قيمة n هي نفسها, قبل وبعد استدعاء أسلوب SquareIt . في الواقع، التغيير الذي يتم تطبيقه داخل الأسلوب يؤثر فقط على المتغير المحليx.

المثال التالي هو نفس المثال السابق، عدا تمرير المعلمة باستخدام الكلمة الأساسية ref . يتم تغيير قيمة المعلمة بعد استدعاء الأسلوب.

class PassingValByRef
{
    static void SquareIt(ref int x)
    // The parameter x is passed by reference.
    // Changes to x will affect the original value of x.
    {
        x *= x;
        System.Console.WriteLine("The value inside the method: {0}", x);
    }
    static void Main()
    {
        int n = 5;
        System.Console.WriteLine("The value before calling the method: {0}", n);

        SquareIt(ref n);  // Passing the variable by reference.
        System.Console.WriteLine("The value after calling the method: {0}", n);

        // Keep the console window open in debug mode.
        System.Console.WriteLine("Press any key to exit.");
        System.Console.ReadKey();
    }
}
/* Output:
    The value before calling the method: 5
    The value inside the method: 25
    The value after calling the method: 25
*/

في هذا المثال، ليست قيمة n هي التي يتم تمريرها; بدلاً من ذلك، فإن المرجع لـ n هي الذي يتم تمريره. المعلمة x ليست عدد صحيح; هي مرجع لـ int، و في هذه الحالة، هي مرجع لـ n. لذلك عندما يتم تربيع x داخل الأسلوب, فإن ما يتم تربيعه فعلياً ما يشير إليه x : n.

مثال شائع لتغيير القيم للمعلمات التي تم تمريرها هو أسلوب Swap حيث يتم تمرير متغيرين x و y، يقوم الأسلوب بمبادلة محتوياتها. يجب تمرير المعلمات إلى أسلوب Swap حسب المرجع; التي وإلا، فإنك ستتعامل مع نسخ محلية للمعلمات داخل الأسلوب. المثال التالي لأسلوب Swap الذي يستخدم معلمات المرجع:

static void SwapByRef(ref int x, ref int y)
{
    int temp = x;
    x = y;
    y = temp;
}

عند استدعاء هذا الأسلوب, قم باستخدام الكلمة الأساسية ref في الاستدعاء كما يلي:

static void Main()
{
    int i = 2, j = 3;
    System.Console.WriteLine("i = {0}  j = {1}" , i, j);

    SwapByRef (ref i, ref j);

    System.Console.WriteLine("i = {0}  j = {1}" , i, j);

    // Keep the console window open in debug mode.
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
}
/* Output:
    i = 2  j = 3
    i = 3  j = 2
*/

راجع أيضًا:

المرجع

تمرير المعلمات (دليل البرمجة لـ #C)

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

المبادئ

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