C#中的ref和out提供了值類型按引用進行傳遞的解決方案,當然引用類型也可以用ref和out修飾,但這樣已經失去了意義。因為引用數據類型本來就是傳遞的引用本身而非值的拷貝。ref和out關鍵字將告訴編譯器,現在傳遞的是參數的地址而不是參數本身,這和引用類型默認的傳遞方式是一樣的。
ref和out的區別:
1、重載:out和ref不能構成重載,編譯器提示:不能定義僅在ref和out的上存在不同的重載方法
eg、
static void Fun(ref int a,ref int b)
{
a = a + b;
b = 6;
}
static void Fun(out int a,out int b)
{
b = 6;
a = 14;
}
2、調用前賦值
ref作為參數的函數在調用前,實參必須賦初始值。
out作為參數的函數在調用前,實參可以不賦初始值。
3、函數中,參數賦值
在調用函數中,out引入的參數必須賦值;
而ref引入的參數在返回前可以不賦值;
比較完整的測試代碼:
class Program
{
static void Main(string[] args)
{
int a = 6;
int b = 66;
Fun(ref a,ref b);
//Fun(out a,out b);
Console.WriteLine("a:{0},b:{1}",a,b);
Console.ReadLine();
}
static void Fun(ref int a,ref int b)
{
a = a + b;
// b = 6;
}
/*
static void Fun(out int a,out int b)
{
b = 6;
a = 14;
}*/
}
----------------------------------------------------------------------------------------------------------------------------------
ref關鍵字用於將方法內的變量改變后帶出方法外。具體我們通過例子來說明:
static void Main(string[] args)
{
int c = 0;
Add(1, 2,ref c);
Console.WriteLine(c);
}
static void Add(int a, int b, ref int c)
{
c = a + b;
}
最后打印出來的結果是3。如果沒有加ref參數,由於沒有Add()方法沒有返回值,調用后,打印出來的結果仍然是0