ref和out 都是按地址传递的,使用后都将改变原来的数值。
1、ref 参数 ref是有进有出
- 带着参数进去,执行里边的方法后,出来的时候值进行了变化
- 类似于
C
语言的指针变量,这是C#
中的参数引用传递,在方法中对参数所做的任何改变都将反映在该变量中 - 在方法中,当
ref
进来的值发生变化后,就会改变参数的值
void Start()
{
int num1 = 10;
int num2 = 20;
SetTest(ref num1, num2);
Debug.LogError(num1); // 此时输出:num1 = 3
Debug.LogError(num2); // 此时输出:num2 = 20
}
/// <summary>
/// ref 有进有出,只是进出一下 不做任何改变
/// </summary>
/// <param name="num"></param>
/// <param name="num2"></param>
public void SetTest(ref int num, int num2)
{
Debug.LogError(num + num2); // 此时输出 :num = 10 num2 = 20
num = 3;
num2 = 4;
Debug.LogError(num + num2); // 此时输出 :num = 3 num2 = 4
}
2、out 参数out是只出不进
- 不用带着参数进去,执行里边的方法后,出来的时候参数已经赋值了
- 用在没有返回值的函数就能返回值,例如在返回值是void的函数就能返回,还有就是我们经常使用的都是返回一个值得,那么我们如果想在一个函数中返回多个值呢,那么
out
就起作用了,我们可以使用out
返回多个值
void Start()
{
int num3;
SetTest(out num3);
Debug.LogError(num3); // 此时输出:num3 = 5
}
public void SetTest(out int num)
{
num = 5;
Debug.LogError("out:" + num); // 此时输出:num = 5
}
3、params
params
是为动态数组而准备的,我们直接输入数组的元素就行了
void Start()
{
GetDD(1, 2, 3);
}
private void GetDD(params int[] pp)
{
foreach (var item in pp)
{
print(item);
}
}
- 如果不加
params
,我们只能这样用
void Start()
{
Getdd(new[] {1, 2, 3});
}
private void Getdd(int[] pp)
{
foreach (var item in pp)
{
print(item);
}
}