因為在C#裡string物件是不變物件,假設有string str1="abc";那麼如果存在有這麼一條語句對str1進行再次賦值 如str1="123",那麼,此時指向str1的棧的地址並未發生改變,而是在託管堆裡重新建立一個新的物件,其值為123,而str1的棧指向託管堆裡123的地址,而原先的abc即將會被垃圾回收機制清理掉。所以ChangeString函數里對形參s賦值過程是這樣子的:形參s首先也指向了abc,但在函式體裡s又被指向了HaHa,那麼此時是s改變了指向,而實參str並沒有改變它原來的指向abc. 所以要想在函數里改變實參的值必須用ref,除物件和集合外。
static void Main(string[] args)
{
string str = "123";
Console.WriteLine(str);
ChangeString(ref str); // 使用ref引用型,形參則可以改變實參的值
Console.ReadKey();
}
public static void ChangeString(ref string s) // 加ref,形參可以更改實參的值
s = "HaHa";
因為在C#裡string物件是不變物件,假設有string str1="abc";那麼如果存在有這麼一條語句對str1進行再次賦值 如str1="123",那麼,此時指向str1的棧的地址並未發生改變,而是在託管堆裡重新建立一個新的物件,其值為123,而str1的棧指向託管堆裡123的地址,而原先的abc即將會被垃圾回收機制清理掉。所以ChangeString函數里對形參s賦值過程是這樣子的:形參s首先也指向了abc,但在函式體裡s又被指向了HaHa,那麼此時是s改變了指向,而實參str並沒有改變它原來的指向abc. 所以要想在函數里改變實參的值必須用ref,除物件和集合外。
static void Main(string[] args)
{
string str = "123";
Console.WriteLine(str);
ChangeString(ref str); // 使用ref引用型,形參則可以改變實參的值
Console.WriteLine(str);
Console.ReadKey();
}
public static void ChangeString(ref string s) // 加ref,形參可以更改實參的值
{
s = "HaHa";
}