前置知識
- 值型別:
int、struct 等,傳值會複製。
- 參考型別:
class,傳遞參考(類似指標)。
struct 在 C# 是值型別,C++ 則與 class 幾乎相同,易混淆。
MSDN 範例:值型別
public static void TestRef(ref char i) { i = 'b'; }
public static void TestNoRef(char i) { i = 'c'; }
char i = 'a';
TestRef(ref i); Console.WriteLine(i); // b
TestNoRef(i); Console.WriteLine(i); // b
改為參考型別測試
public class MyClass { public int Value; }
public static void TestRef(ref MyClass m) { m.Value = 10; }
public static void TestNoRef(MyClass m) { m.Value = 20; }
public static void TestCreateRef(ref MyClass m) { m = new MyClass(); m.Value = 100; }
public static void TestCreateNoRef(MyClass m) { m = new MyClass(); m.Value = 200; }
MyClass m = new MyClass(); m.Value = 1;
TestRef(ref m); Console.WriteLine(m.Value); // 10
TestNoRef(m); Console.WriteLine(m.Value); // 20
TestCreateRef(ref m); Console.WriteLine(m.Value); // 100
TestCreateNoRef(m); Console.WriteLine(m.Value); // 100
觀察重點
TestRef/TestNoRef 皆修改物件屬性,結果相同。
TestCreateRef 重新指派呼叫端變數,影響後續。
TestCreateNoRef 僅修改區域參數,呼叫端仍指向原物件(Value=100)。