一、在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/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。