C# 中out,ref,params参数的使用
C#中有三个高级参数,分别是out,ref,params:
1、out参数
- 方法使用return 只能返回一个值(一个数值或一个指针值),out参数可以帮助我们在一个方法中返回多个值,不限类型。
- 在使用out参数的时候需要注意:
- 在调用方法之前,对out参数传递的变量只需声明,可以赋值也可以不赋值,赋值也会在方法中被覆盖掉。
- 方法使用了out参数传递变量时,就是要返回值,所以必须在方法内为其赋值。
- 方法的参数使用out关键字修饰时,在调用该方法时,也要在out参数传递的变量前面加上out关键字才行。
static void Main(string[] args)
{
// 使用out参数返回一个数组的最大值、最小值
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int max;
int min;
GetMaxMinSumAvg(nums, out max, out min);
Console.WriteLine(max);
Console.WriteLine(min);
Console.ReadKey();
}
public static void GetMaxMinSumAvg(int[] nums, out int max, out int min)
{
max = 0; // out参数传递的变量必须在方法内为其赋值
min = 0;
if(nums.Length > 0)
{
for (int i =0; i < nums.Length; i++)
{
if (nums[i] > max)
max = nums[i];
if (nums[i] < min)
min = nums[i];
}
}
}
- TryParse类型转换就使用out参数返回转换结果值:
Boolean int.TryParse(string s, out int result) // 将字符串转换为int类型,out传递的变量result为转换结果(若转换失败返回result为0)方法return Boolean 类型
自定义int.TryParse()方法
public static Boolean stringToInt(string s, out int result) {
try
{
result = Convert.ToInt32(s);
return true;
}
catch {
result = 0;
return false;
}
}
2、 ref参数
- ref 关键字,和out一样,可以使得参数通过引用来传递。换句话说,ref能够让你直接对原来那个数进行操作,而不是将原数复制一份,对那个复制项进行操作。
- ref参数的作用:
- 与out不同的是,它可以双向传值,主要适用于场景内部对外部的值进行改变的情况。换句话说,ref参数侧重于将一个已经初始化了的变量以参数的形式带到一个方法中进行改变,改变完成后,再将改变后的值带出来。
- ref的作用主要是让值类型或string这种特殊类型的引用类型能够像其他引用类型一样在方法中进行了值的改变,在方法结束之后,能够将值保存下来。
- 在使用ref参数需要注意:
- ref参数传递的变量在传递之前一定要对其进行初始化赋值。
- 方法的参数使用ref关键字修饰时,在调用该方法时,也要在out参数传递的变量前面加上ref关键字才行。
- 方法使用了ref参数传递变量时,不同于out,没有要求一定在方法中对ref所修饰的变量进行赋值,所以可以不赋值。
static void Main(string[] args)
{
int count = 5; // ref修饰的变量,必须对其赋初值
Add(ref count);
Console.WriteLine(count);
Console.ReadKey();
}
public static void Add(ref int i){
i += 5; // 不一定要赋值
}
3、 params可变参数
-
params 关键字可以使得在参数个数可变处采用参数的数组型参数,比如 int sum(params int[] values)。
-
可变参数的作用:使得个数不确定的可变参数以数组的形式传递,适合于方法的参数个数未知的情况时,用于传递大量的数组集合参数。
-
可变参数在使用时需注意:
-
不允许将params修饰符与ref和out修饰符组合起来使用。
-
当方法的参数列表中有多个参数时,params修饰的参数必须放在最后,不能放在前面,以免程序不好确定参数究竟有多少个而报错。比如:
int Sum(int initial, params int[] arr)
-
一个方法当然可以包含可变参数和不变参数,两个可以同时使用。
-
public static int Sum(int initial, params int[] arr){
int sum = initial;
for(int i = 0; i < arr.Length; i++)
sum+=arr[i];
}
return sum;
}