C#中out、ref和params的区别

1.out参数

如果在一个方法中,返回多个相同类型的值的时候,可以考虑返回一个数组,但是,如果返货多个不同类型的值的时候,返货数组就不行了,这是可以考虑用到out参数。

求一个数组内部的最大值,最小值,总和,平均值

例如:

static void Main(string[] args)
{
  int[] nums = { 1, 2, 3, 4, 5, 6 };
  int max1 = 0;
  int min1 = 0;
  int sum1 = 0;
  int avg1 = 0;
  Text(nums, out max1, out min1, out sum1, out avg1);
  Console.WriteLine("最大值{0},最小值{1},总和{2},平均值{3}", max1, min1, sum1, avg1);

  Console.ReadKey();
}
public static void Text(int []nums,out int max,out int min,out int sum,out int avg)
{
  //注意:out参数要求在方法的内部必须为其赋值
  max = nums[0];
  min = nums[1];
  sum = 0;
  for (int i = 0; i < nums.Length; i++)
  {
    if (nums[i] > max)
    {
      max = nums[i];
    }
    if (nums[i] < min)
    {
      min = nums[i];
    }
    sum += nums[i];
  }
  avg = sum / nums.Length;
  //最后不需要用return返回值
}

2.ref参数

ref参数能将一个变量带入方法中进行改变,改变完成后,再将改变后的值带出方法。

例如:

static void Main(string[] args)
{
  int salary = 1000;

  TestRef(ref salary);
  Console.WriteLine(salary.ToString());

  Console.ReadKey();
}

public static void TestRef(ref int num)
{
  num += 200;
}

3.params参数

将实参列表中跟可变参数数组类型一致的元素都当做数组的元素去处理。

params可变参数必须是形参列表中的最后一个元素,形参里面最多只能有一个params参数

例如:

static void Main(string[] args)
{
  Test("张三", 97, 98, 99);

  Console.ReadKey();
}
//求某人总成绩
public static void Test(string name,params int []score)
{
  int sum = 0;
  foreach (int num in score)
  {
    sum += num;
  }
  Console.WriteLine("{0}的总成绩是{1}", name, sum);
}

ref,out,in 三者的区别:

  ref:使用ref关键字进行值类型和引用类型参数的按引用传递时,传入的参数必须被初始化,否则编译报错,在方法的内部可以不对传入的参数进行i内部处理,传入的参数也可以被使用。

  out:使用out关键字进行值类型和引用类型参数的按引用传递时,传入的参数可以不先被初始化,(如果传入的参数事先初始化,在传入的过程中也会被清空),编译不会报错,但是在方法的内部可以必须对传入的参数完成初始化操作,传入的参数才能被使用,否则编译出错。

  in:默认的传递方式,向函数内部传递值,传入的过程中参数的初始化不会被改写。