C#之ref 參數


首先,來看一句比較繞嘴的話

變量作為參數傳給方法,同時希望在方法執行完成后,對參數所做的修改能夠反映到變量上

該怎么處理呢?

你們覺得繞口嗎?覺得繞口也沒關系,因為看完我下面的講解,你再理解這句話就會容易很多了。

接着進入文章正題部分

第一步:在控制台上寫一個方法,方法的功能就是交換傳入的數值,代碼如下

static void TestRef(int x, int y)
{
    int temp;
    temp = y;
    y = x;
    x = temp;
}

 

第二步:在 Main 函數里聲明兩個 int 類型的變量 x,y,然后調用 TestRef 方法。為做直觀的對比,這里我把交換 x,y 前和交換 x,y后都在控制台上打印出來,代碼如下

static void Main(string[] args)
{
    int x = 10;
    int y = 20;
    Console.WriteLine("交換前:x={0},y={1}", x, y);
    TestRef(x, y);
    Console.WriteLine("交換后:x={0},y={1}", x, y);
    Console.ReadKey();
}

啟動項目,結果如下

我們明明調用了可以交換傳入數值位置的函數 TestRef,為什么卻沒有交換 x 和 y 的位置呢?

原因分析
首先,函數本身沒有問題,問題在於 int 是值類型,它所創建的實例不在托管堆中分配內存,而是直接存儲在變量中。雖然我們調用了函數 TestRef,但也不過只是復制了一遍 x,y 的值而已。那我們想在調用完交換函數 TestRef 后,x,y的位置可以交換,該怎么做呢?

這就要引入關鍵字 ref

什么是 ref
ref (全拼:reference):強制要求參數按引用傳值。

使用 ref 關鍵字 有兩個注意事項,如下

一:傳入參數之前,必須給參數賦值。
二:調用方法時,必須加 ref 關鍵字。
驗證注意事項一:

現在假如我們不給 x 賦初始值,會有什么問題呢?

驗證注意事項二:

我們在函數 TestRef 里參數類型前面加上 ref 關鍵字


然后直接調用這個函數會有什么問題呢?

以上兩個驗證便是使用 ref 關鍵字需要注意的事項。

在調用函數里加上ref關鍵字后

我們再按F5,看有什么不一樣的效果

OK。x,y交換位置成功。

現在再回頭看那句繞嘴的話,變量作為參數傳給方法,同時希望在方法執行完成后,對參數所做的修改能夠反映到變量上,現在應該容易理解了吧!
————————————————
版權聲明:本文為CSDN博主「Allen Su」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_42351033/article/details/85121688


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM