C#7.0--引用返回值和引用局部變量

  1、在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);
引用返回值所返回變量指向對象的生命週期必須大於方法,即不能返回指向值類型局部變量的變量(值類型局部變量會在方法執行完返回時進行回收),能夠返回指向引用類型局部變量的變量、傳遞給方法的引用參數、靜態字段和實例字段;spa

  ※引用返回值不能夠返回字面量、常量、枚舉或按值返回的方法、屬性,但能夠返回當前值爲null的符合上述條件的變量;
  ※異步方法不能使用引用返回值,由於異步方法可能會在執行還沒有完成且返回值未知時就返回;
  4.查看聲明引用返回值方法的IL代碼:code

  5.在調用引用返回值的方法時,調用方能夠選擇將方法返回的變量看成按值返回或是按引用返回處理,若是是按值返回處理,則與調用普通方法同樣:對象

int[] myNums = new int[] { 1, 2, 3, 4, 5 };
int myNum = MyFunc(myNums);

  6.若是是按引用返回處理,則調用方須要使用引用局部變量(Reference Local Variable,或ref locals)接收,保留對方法返回變量的引用:blog

ref int myNum = ref MyFunc(myNums);

 

  2、可使用關鍵字ref聲明引用局部變量、初始化引用局部變量及調用引用返回值的方法:索引

ref int myNum = ref myNums[0]; //此時引用局部變量myNum保存的是數組myNums中索引0的內存地址

  1.使用引用局部變值避免了值類型在賦值時的淺拷貝操做,提升了效率;生命週期

  2.引用局部變量必須在聲明時進行初始化,初始化時會確認該引用局部變量的做用範圍,這個做用範圍決定該引用局部變量可否做爲引用返回值返回;
對引用局部變量的賦值操做,將直接改變該變量所指向內存地址中對象的值:內存

myNum = 10;
Console.WriteLine(myNums[0]); //10

  3.對引用局部變量的讀取操做與普通局部變量同樣,將訪問該變量所指向內存地址中對象的值:get

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/

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。

相關文章
相關標籤/搜索