C#知識點講解之ref和out關鍵字的前世今生

今天來講講ref和out關鍵字的前世今生

前言

C#中數據類型分爲值類型和引用類型
在這裏插入圖片描述
乾貨:
方法聲明的參數列表中的參數叫做形參,實際調用方法時傳遞給方法的參數叫做實參,調用方法時,程序會首先將實參的值傳遞給對應的形參,而後執行方法體中的代碼。對於引用類型的參數,實參和形參會指向同一個對象。而對於值類型的參數,實參的值將被複制一份給形參,方法代碼中的對形參的修改不會影響到實參。

爲了解決這一問題,C#中提供了方法參數的引用傳遞方式,ref關鍵字。

此時形參是實參的”引用”,二者指向同一個變量,如果代碼中修改了形參的值,實參的值也會改變,這樣就能真正起到交換參數值的效果了。
先來看一個栗子:

	//一會要用到的方法
	private void CorrectCount(int count)
    {
         count = 11;
    }
	private void CorrectCount(ref int count)
    {
         count = 11;
    }
    
	int count = 0;
	Debug.Log("Origin count: " + count);
	CorrectCount(count);
	Debug.Log("Correct count: " + count);
	CorrectCount(ref count);
	Debug.Log("Correct count ref : " + count);

	//輸出:
	Origin count: 0
	Correct count: 0
	Correct count ref : 11

我們再看一個特殊的栗子:

	//一會要用到的方法
	private void CorrectCount(string count)
    {
         count = "11";
    }
	private void CorrectCount(ref string count)
    {
         count = "11";
    }
	string count = "0";
	Debug.Log("Origin count: " + count);
	CorrectCount(count);
	Debug.Log("Correct count: " + count);
	CorrectCount(ref count);
	Debug.Log("Correct count ref : " + count);

	//輸出:
	Origin count: 0
	Correct count: 0
	Correct count ref :11

嗯?剛剛不是說,ref是爲了解決值類型無法在方法內外真正交換參數值的問題嗎? string 明明是引用類型,爲啥子也不能【黑人問號臉】
這裏需要特別注意的是,string雖然是引用類型,但這個東東太特殊了,C#對它進行了特殊處理,雖然它本身是引用類型,但相關操作都會導致它產生一個新的string對象,你看,你傳進去是小明,人家在裏面改了名字叫老王了。所以如果是string類型,也要用ref。
那還有其他的嗎。不,沒了,其他的引用類型(就剩class了)隨便用。就算你class裏面定義了很多值類型,在方法裏面也修改了, 沒得關係。但如果你的實參直接是class.int 對不起,你這個是值類型。

ref弄透徹了,再來說說它兄弟out

out關鍵字,加了它的就叫輸出型參數(ref 是引用型參數)。其實兩個用法差不多,只是有一些小區別罷了。
那就來看看他們的區別把:
round one:
ref:我可進可出(可以傳值進來,我也可以傳出去)
out:我只出不進(不能傳值進來,但我可以傳出去)
round two:
ref:進來之前必須初始化
out:進來之前愛咋地咋地,進來後,我就給你初始化(必須賦值才能出)
round three:
ref:我們倆兄弟不能構成重載
out:對,我們倆兄弟不能構成重載(如果兩個方法只是ref和out關鍵字不同,其他的方法名/參數類型等都相同的話,不構成重載,編譯器會報錯)
舉個簡單的out的栗子:

        private void CorrectCountOut(out int count)
        {
            count = 33;
        }
        
        int count;
        CorrectCountOut(out count);
        Debug.Log("Correct count out: " + count);

		//輸出
		Correct count out: 33
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章