C#里面的 out 和ref參數時常會用到,但對它們的區別比較模糊。所以總結一下。下面是測試代碼:
1 public void Start() 2 { 3 //outSum沒必要賦值,賦值了也完全沒用。 4 //如果AddByOut函數內部直接使用out對應的參數,會報錯:使用了未被賦值的 out 參數a 5 int outSum = 1; 6 int ov1 = 2; 7 int ov2 = 3; 8 AddByOut(out outSum, ov1, ov2); 9 Console.WriteLine("outSum : " + outSum + " v1: " + ov1 + " v2: " + ov2); 10 11 12 //refSum 必須賦值 13 int refSum = 1; 14 int rv1 = 2; 15 int rv2 = 3; 16 //如果refSum沒有賦值,這里會報錯:使用了未賦值的局部變量 refSum 17 AddByRef(ref refSum, rv1, rv2); 18 Console.WriteLine("refSum : " + refSum + " v1: " + rv1 + " v2: " + rv2); 19 } 20 21 public void AddByOut(out int a, int b, int c) 22 { 23 //a = a + b + c;// a 未被賦值,不能直接使用,即使是調用的地方 out對應的參數初始化也沒用 24 a = b + c; 25 } 26 27 public void AddByRef(ref int a, int b, int c) 28 { 29 a = a + b + c; // 可以直接使用a 30 }
測試結果:
總結: 1、調用帶ref關鍵字的函數,必須對 ref 對應的參數賦值;而out關鍵字不需要。
2、帶ref 關鍵字的函數內部可以直接使用 ref 對應的參數;out 關鍵字的函數,必須在函數內部對out對應的參數賦值后才能使用。
(歸結1,2點:ref在外面初始化,out在里面初始化)
3、兩個關鍵字都能使值類型按引用類型使用,即修改了函數外部申明的變量
注:更多專業介紹請參考微軟官方文檔
out 參數修飾符(C# 參考) https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/out-parameter-modifier
ref(C# 參考) https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/ref