C#方法使用ref、out、params进行参数传递
1.普通传递方式
传值过程中会为每个参数创建一个新的存储位置,并且实际参数的值会复制给形参,因此实参和形参使用的是两个不同内存中的值。
static void Main(string[] args)
{
int y = 3;
Console.WriteLine($"调用Method方法前y的值:{y}");//输出:3
Method(y);
Console.WriteLine($"调用Method方法后y的值:{y}");//输出:3
}
static void Method(int x)
{
x += x;
Console.WriteLine($"Method方法内的值:{x}");//输出:6
}
2.ref 传递方式
ref 传递方式,又称为按引用参数传递,意思就是对变量存储地址的引用。引用参数与提供给方法的实际参数具有相同的内存地址,因此改变方法里的值,就等同于改变实参的值。
注意:
1、需要在实参变量和形参声明前同时使用ref关键字。
2、方法外必须为其参数赋值,而方法内可以不赋值。
static void Main(string[] args)
{
int y = 3;
Console.WriteLine($"调用Method方法前y的值:{y}");//输出:3
Method(ref y);
Console.WriteLine($"调用Method方法后y的值:{y}");//输出:6
}
static void Method(ref int x)
{
x += x;
Console.WriteLine($"Method方法内的值:{x}");//输出:6
}
3.out 传递方式
out传递方式,称为按输出参数传递。用户自定义的方法一般可以通过return语句返回一个值。如果希望方法返回多个值,可以使用out关键字进行参数传递。对于输出参数来说,调用方提供的实参的初始值并不重要。
注意:
需要在实参变量和形参声明前同时使用out关键字,且需要在被调用方法中必须赋值。
static void Main(string[] args)
{
int[] arr = new int[] { 5, 4, 8, 3, 1, 10, 5 };
int minIndex = -1;
Console.WriteLine($"Main方法中下标索引:{minIndex}");//输出:-1
int minNum = GetMinNum(arr, out minIndex);
Console.WriteLine($"数组最小值:{minNum},下标索引:{minIndex}");//输出:1 4
}
/// <summary>
/// 求整型数组中最小的值及索引
/// </summary>
/// <param name="arr">所求数组</param>
/// <param name="minIndex">最小值索引</param>
/// <returns>返回最小值</returns>
static int GetMinNum(int[] arr, out int minIndex)
{
int minNum = arr[0];
minIndex = 0;//必须在方法中为其赋值
for(int i = 0; i < arr.Length; i++)
{
if(minNum > arr[i])
{
minNum = arr[i];
minIndex = i;
}
}
return minNum;
}
4.params 传递方式
params 传递方式,又称为按参数数组传递。当声明一个方法时,用户不能确定要传递的参数个数时,可以使用params关键字来定义,从而将实参列表中跟形参数组类型一致的元素都处理为其数组的元素。
注意:
1、实参类型必须与形参定义的一致。
2、可变参数必须是形参的最后一个。
static void Main(string[] args)
{
int a = 1, b = 2, c = 6;
string name = "小明";
CalculateStuScore(name, a, b, c);
}
/// <summary>
/// 计算学生成绩
/// </summary>
/// <param name="name">姓名</param>
/// <param name="arr">每科成绩</param>
static void CalculateStuScore(string name, params int[] arr)
{
int sum = 0;
for(int i = 0; i < arr.Length; i++)
{
sum += arr[i];
}
Console.WriteLine($"{name}的总成绩:{sum}");//输出:小明的总成绩:9
}
因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。