一、 參數的一般傳遞方式
在c#中,除非使用ref或者out前綴,所有參數都通過值來傳遞。變量的棧數據會完整復制到目標參數中。分為以下3種情況:
1、 引用類型的變量只包含對象所在的內存地址,將要復制的是內存地址而不是對象本身,所以對底層對象的修改會保留。如果在方法內部將內存地址指向一個新對象,則方法結束後在方法中所作的修改會被丟棄(原指針仍指向原對象,方法參數指向新對象,結束後一起銷毀)。
class Program
{
static void Main(string[] args)
{
Employee myE = new Employee() { id=4};
Console.WriteLine("初始化為:"+myE.id);
testMethod(myE);
Console.WriteLine("退出方法後:"+myE.id);
Console.ReadLine();
}
static void testMethod(Employee myE)
{
//myE.id = 5;
myE = new Employee() { id = 5 };
Console.WriteLine("更改為:"+myE.id);
}
}
class Employee
{
public int id { get; set; }
}
該程序輸出為
2、 值類型對象包含的是實際數據,傳遞給方法的是數據本身的副本,對值類型對象的修改在方法結束後會被丟棄。
3、String類型在實際使用中當做值類型對待。
二、 參數的特殊傳遞方式
1、ref參數
作用:迫使值參數通過引用傳送給方法。
2、out參數
作用:在參數未初始化的情況下,在一個函數中輸出多個值。隱含ref。
C#要求變量在被引用前必須初始化。盡管在傳遞前,可以用沒有意義的值初始化他們,然後用ref引用傳遞,但有時會引起混亂。用out可以使參數在未初始化情況下使用,邏輯性更強。
3、params數量可變參數
作用:自動把參數轉為數組。
調用方法有兩種,見示例。
static string Combine(params string[] paths)
{
string result = string.Empty;
foreach (string path in paths)
{
result = System.IO.Path.Combine(result, path);
}
return result;
}
static void test()
{
//調用方法1,直接輸入,如果不使用params前綴就不能用這種方式
string path1 = Combine("", "", "");
//調用方法2,string數組,不使用params前綴也能用這種方式
string path2 = Combine(new string[] {"","","" });
}
三、 傳遞參數注意事項:
1、 屬性不是變量,因此不能傳給out 或ref參數
2、 除非使用out前綴,所有參數必須在使用前初始化。
3、out參數必須在函數結束前賦值,賦值null也可以。