ارسال آرگومان ها به روش ارجاع

آرگومان‌ها را می‌توان به کمک ارجاع ارسال کرد. این بدان معناست که شما آدرس متغیری را ارسال می‌کنید نه مقدار آن را. ارسال با ارجاع زمانی مفید است که شما بخواهید یک آرگومان که دارای مقدار بزرگی است (مانند یک آبجکت) را ارسال کنید. در این حالت وقتی که آرگومان ارسال شده را در داخل متد اصلاح می‌کنیم مقدار اصلی آرگومان در خارج از متد هم تغییر می‌کند.
در زیر دستورالعمل پایه‌ای تعریف پارامترها که در آنها به جای مقدار از آدرس استفاده شده است نشان داده شده :

returnType MethodName(ref datatype param1)
{
   code to execute;
}

فراموش نشود که باید از کلمه کلیدی ref استفاده کنید. وقتی یک متد فراخوانی می‌شود و آرگومانها به آنها ارسال می‌شود هم باید از کلمه کلیدی ref استفاده شود.

MethodName(ref argument);

اجازه دهید که تفاوت بین ارسال با ارجاع و ارسال با مقدار آرگومان را با یک مثال توضیح دهیم.

   1: using System;
   2: 
   3: public class Program
   4: {
   5:     static void ModifyNumberVal(int number)
   6:     {
   7:         number += 10;
   8:         Console.WriteLine("Value of number inside method is {0}.", number);
   9:     }
  10: 
  11:     static void ModifyNumberRef(ref int number)
  12:     {
  13:         number += 10;
  14:         Console.WriteLine("Value of number inside method is {0}.", number);
  15:     }
  16: 
  17:     public static void Main()
  18:     {
  19:         int num = 5;
  20: 
  21:         Console.WriteLine("num = {0}n", num);
  22: 
  23:         Console.WriteLine("Passing num by value to method ModifyNumberVal() ...");
  24:         ModifyNumberVal(num);
  25:         Console.WriteLine("Value of num after exiting the method is {0}.n", num);
  26: 
  27:         Console.WriteLine("Passing num by ref to method ModifyNumberRef() ...");
  28:         ModifyNumberRef(ref num);
  29:         Console.WriteLine("Value of num after exiting the method is {0}.n", num);
  30:     }
  31: }
num = 5

Passing num by value to method ModifyNumberVal() ...
Value of number inside method is 15.
Value of num after exiting the method is 5.

Passing num by ref to method ModifyNumberRef() ...
Value of number inside method is 15.
Value of num after exiting the method is 15.

در برنامه بالا دو متد که دارای یک هدف یکسان هستند تعریف شده‌اند و آن اضافه کردن عدد 10 به مقداری است که به آنها ارسال می‌شود. اولین متد (خطوط 9-5) دارای یک پارامتر است که نیاز به یک مقدار آرگومان (از نوع int) دارد. وقتی که متد را صدا می‌زنیم و آرگومانی به آن اختصاص می‌دهیم (خط 24)، کپی آرگومان به پارامتر متد ارسال می‌شود. بنابراین مقدار اصلی متغیر خارج از متد هیچ ارتباطی به پارامتر متد ندارد. سپس مقدار 10 را به متغیر پارامتر (number) اضافه کرده و نتیجه را چاپ می‌کنیم.
برای اثبات اینکه متغیر num هیچ تغییری نکرده است مقدار آن را یکبار دیگر چاپ کرده و مشاهده می‌کنیم که تغییری نکرده است. دومین متد (خطوط 15-11) نیاز به یک مقدار با ارجاع دارد. در این حالت به جای اینکه یک کپی از مقدار به عنوان آرگومان به ان ارسال شود آدرس متغیر به آن ارسال می‌شود. حال پارامتر به مقدار اصلی متغیر که زمان فراخوانی متد به آن ارسال می‌شود دسترسی دارد. وقتی که ما مقدار متغیر پارامتری که شامل آدرس متغیر اصلی است را تغییر می‌دهیم (خط 13) در واقع مقدار متغیر اصلی در خارج از متد را تغییر داده‌ایم. در نهایت مقدار اصلی متغیر را وقتی که از متد خارج شدیم را نمایش می‌دهیم و مشاهده می‌شود که مقدار آن واقعاً تغییر کرده است.