天天看點

C#關于ref與out的總結

首先大概說下函數調用的過程,首先為被調用函數配置設定存儲空間(分為代碼區和變量區)之後将調用函數傳遞過來的變量壓棧,然後逐一彈棧進行處理,之後進行運算,将需要傳回的變量壓棧,然後釋放存儲空間,傳回調用函數,繼續執行下面的代碼。

是以在這裡就有一個問題,如果我們想要把在被函數中對參數值的修改傳回給調用函數怎麼辦(除了我們可以用return傳回一個執行結果)。

在c語言中提供了指針變量,我們可以靈活的運用指針型變量進行參數位址的互相傳遞,并實作了對同一存儲空間的變量的操作。這樣當調用函數的時候,在被調用函數中對參數的修改就會直接操作調用函數變量的存儲空間,這樣就得到了儲存。

在c++中取締了指針變量,因為它是類型不安全的,容易引起系統的崩潰。取而代之的是引用,所謂引用就是當我們調用函數的時候,編譯器會将調用函數的變量名重命名為調用函數的變量名,這樣我們在被調用函數中對變量的操作,就是直接對調用函數的變量操作,這樣就得到了儲存。

在C#中同樣使用了引用。今天特别記錄下C#中提供了兩個,一個是ref,還有一個是out。這兩個引用是有差別的,按照C#中的說法:ref叫做引用參數,要傳遞值并原地修改它(也就是在相同的記憶體位置),用引用參數就很友善。因為傳遞了一個變量給該方法(不僅僅是它的值),這裡調用被調用函數的時候變量必須被初始化。

out叫做輸出參數,傳遞參數可以把它設作一個輸出參數。一個輸出參數僅用于從方法傳遞回一個結果。它和引用參數的另一個差別在于:調用者不必先初始化變量才調用方法。(我的了解這裡其實就是實作多個return,傳回多個運作結果)

e.g:

1> 在此例中,在調用方(Main 方法)中聲明數組 theArray,并在

FillArray

方法中初始化此數組。然後将數組元素傳回調用方并顯示。

class TestOut

{

   static void

FillArray(out int[] arr)

    {

       // Initialize the array:

arr = new int[5] { 1, 2, 3, 4, 5 };

    }

Main()

       int[] theArray; // Initialization is not required

       // Pass the array to the callee using

out:

FillArray(out theArray);

       // Display the array

elements:

System.Console.WriteLine("Array

elements are:");

       for (int i = 0; i < theArray.Length;

i++)

System.Console.Write(theArray[i] + " ");

}

       // Keep the console window open in debug

mode.

System.Console.WriteLine("Press

any key to exit.");

System.Console.ReadKey();

2> 在此例中,在調用方(Main 方法)中初始化數組 theArray,并通過使用

ref 參數将其傳遞給 FillArray 方法。在

方法中更新某些數組元素。然後将數組元素傳回調用方并顯示。

class TestRef

FillArray(ref int[] arr)

       // Create the array on

demand:

       if (arr == null)

arr = new int[10];

       // Fill the array:

arr[0] = 1111;

arr[4] = 5555;

       int[] theArray = { 1, 2, 3, 4, 5

};

       // Pass the array using

ref:

FillArray(ref theArray);

       // Display the updated

array:

特此記錄,感謝論壇上的文章及相關文章。