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