C# 方法参数params ref out 的理解和区分

时间:2022-05-18 03:37:25

1.params    MSDN解释 关键字可以指定在参数数目可变处采用参数的参数方法

通俗理解:譬如,定义一个数组时,不知数组长度时,便可用params关键字修饰。

在方法声明中的params关键字之后不允许任何其他参数,并且在方法生命中只允许一个params关键字。

2.ref    MSDN解释:ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。

其实在C#中,一般情况下,我们在给方法传参数时,实际上是使用的是参数的一个副本,就是将原来的变量赋值一份,然后传给方法来进行操作,所以在方法内部对参数的操作并不会对原本变量造成影响。但有时候,我们需要产生这种影响,就要使用到ref。此时传给方法的参数不是变量的副本而是变量本身。

3.out    MSDN解释:out 关键字会导致参数通过引用来传递。这与 ref关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。

out与ref类似。不同之处在于out不需要对变量进行初始化。

ref与out的使用时在定义和调用方法时都必须使用。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
//params
private static void useParams(params object[] array)
{
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}
}

//ref
private static void refChange1(int num)
{
num = 1;
}
private static void refChange2(ref int num)
{
num = 1;
}

//out
private static void outChange(out string num)
{
num = "miner";
}

static void Main(string[] args)
{
//params
useParams(1, 2, 3);
useParams("miner", "me");

//ref
int num1 = 0;
refChange1(num1);
Console.WriteLine(num1);//未使用ref的结果
refChange2(ref num1);
Console.WriteLine(num1);//使用ref的结果

//out
string num2;
outChange(out num2);
Console.WriteLine(num2);
Console.ReadLine();
}
}
}