一、在C#7.0以上版本中,方法的返回值可以通過關鍵字ref指定為返回變數的引用(而不是值)給呼叫方,這稱為引用返回值(Reference Return Value,或ref returns);
1.與引用引數一樣,使用關鍵字ref宣告引用返回值:
public ref int MyFunc(int[] nums) { //do… return ref nums[0]; }
2.使用引用返回值避免了值型別在方法返回時的淺拷貝操作,提高了效率;
3.使用引用返回值通常是為了讓呼叫方有權訪問(和修改)此變數,因此引用返回值不支援無返回值方法(即返回值型別為void);
引用返回值所返回變數指向物件的生命週期必須大於方法,即不能返回指向值型別區域性變數的變數(值型別區域性變數會在方法執行完返回時進行回收),可以返回指向引用型別區域性變數的變數、傳遞給方法的引用引數、靜態欄位和例項欄位;
※引用返回值不可以返回字面量、常量、列舉或按值返回的方法、屬性,但可以返回當前值為null的符合上述條件的變數;
※非同步方法不能使用引用返回值,因為非同步方法可能會在執行尚未完成且返回值未知時就返回;
4.檢視宣告引用返回值方法的IL程式碼:
5.在呼叫引用返回值的方法時,呼叫方可以選擇將方法返回的變數當作按值返回或是按引用返回處理,如果是按值返回處理,則與呼叫普通方法一樣:
int[] myNums = new int[] { 1, 2, 3, 4, 5 }; int myNum = MyFunc(myNums);
6.如果是按引用返回處理,則呼叫方需要使用引用區域性變數(Reference Local Variable,或ref locals)接收,保留對方法返回變數的引用:
ref int myNum = ref MyFunc(myNums);
二、可以使用關鍵字ref宣告引用區域性變數、初始化引用區域性變數及呼叫引用返回值的方法:
ref int myNum = ref myNums[0]; //此時引用區域性變數myNum儲存的是陣列myNums中索引0的記憶體地址
1.使用引用區域性變值避免了值型別在賦值時的淺拷貝操作,提高了效率;
2.引用區域性變數必須在宣告時進行初始化,初始化時會確認該引用區域性變數的作用範圍,這個作用範圍決定該引用區域性變數能否作為引用返回值返回;
對引用區域性變數的賦值操作,將直接改變該變數所指向記憶體地址中物件的值:
myNum = 10; Console.WriteLine(myNums[0]); //10
3.對引用區域性變數的讀取操作與普通區域性變數一樣,將訪問該變數所指向記憶體地址中物件的值:
int num = myNum + 10; //20
4.引用區域性變數可以作為引用引數的實參傳遞,同樣需要使用修飾符ref修飾,對於給定的方法:
public void MyFunc(ref int num) { } //使用時: MyFunc(ref myNum);
5.在C#7.3以上版本中,可以對引用區域性變數重新分配其它引用:
myNum = ref MyFunc(myNums);
※給引用區域性變數重新分配不能改變該引用區域性變數在宣告時確認的作用範圍,因此不能給一個作用範圍較大的區域性引用變數賦值一個作用範圍較小的變數;
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!
作者:Minotauros
出處:https://www.cnblogs.com/minotauros/
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。