1.類型
C#中類型分為兩類:值類型和引用類型
1.值類型
所有值類型繼承自System.ValueType類(這是System.Object的一個子類)
值類型變量是直接存儲數據,值類型變量聲明后,不管是否賦值,編譯器都會為其分配內存,值類型一般存在棧區,內存是自動釋放
值類型包括:
int char short long float double bool byted 結構體類型(struct關鍵字定義)
【注意:string是引用類型】
2.引用類型
所有引用類型繼承自System.Object類
變量持有的數據的引用,數據是存在堆區中,引用類型一般存在堆區,內存是由GC釋放
引用類型包括:
string? 所有可以實例化的類(class定義的)? dynamic
2.參數傳遞
1.string類型
這是一個非常特殊的引用類型,如果你直接傳入參數如下:
該函數將傳入的變量統一修改為指定的字符串
//這種寫法,并不能修改函數外的變量的值
public void InitString(string str)
{str = "Init";
}
傳入后,按引用類型的定義來說,這個str肯定被你修改成了"Init",但是很可惜,字符串類型是無法修改的,這樣寫雖然不會報錯,但是功能是有問題的,這時候我們應該使用ref或者out關鍵字進行引用傳遞如下:
public void InitString(out string str)
{str = "Init";
}或者public void InitString(ref string str)
{str = "Init";
}
你或許會說,string類型這不就修改了嗎?但是事實是string是不可變,無法修改的,只能新建,使用ref或者out時都是新建了字符串,然后引用指向了新的字符串
2.值傳遞
值類型作為參數時,如果并非引用傳遞,那使用的是該變量的一個副本(新建的臨時變量)
3.引用傳遞
引用類型除了string外都可以直接作為參數,因為參數復制的是堆區地址,也就是數據的引用,所以修改對外部變量都有效
其次有 ref 和 out 兩個關鍵字,他們定義的參數都可以引用傳遞,直接修改變量的值
教大家怎么記,
ref的意思是參考或者引用,
out就更好記了出去,所以是輸出引用
使用
ref 必須要初始化,函數結束時值可以修改或不修改
out 不需要初始化,函數結束時值必須要修改
作用過程
ref是可以把被引用的值帶入函數中使用的
out傳入參數后,值會被清(即使該參數已經初始化過也一樣)
實際應用
ref一般用于修改變量值或者是交換變量值,或者一些性能優化(使用引用可以使得傳參途中不會新建變量)
//交換x和y的值
public void Swap(ref int x, ref int y)
{int temp = x;x = y;y = temp;
}
out一般用于函數返回值,C#中函數只能返回一個值,但是借助out這個輸出引用,我們可以達到返回多個值的目的
// 方法定義,包含兩個輸出參數
public static void CalculateSumAndDifference(int a, int b, out int sum, out int difference)
{sum = a + b;difference = a - b;
}