C#方法中参数ref和out详解

2019-12-30 18:07:36于丽

与引用参数不同,输出参数有以下要求:

  · 在方法内部,输出参数在被读取之前必须被赋值。 (意味着参数的初始值是无关的,而且没有必要在方法调用之前为实参赋值)

  · 在方法返回之前,方法内部的任何贯穿的可能路径都必须为所有输出参数进行一次赋值。


class MyClass {
  public int val = 100;
}

class Program
{
  /// <summary>
  /// 方法声明
  /// </summary>
  static void FuncData(out MyClass myclass,out int temp)
  {
    myclass = new MyClass(); //创建一个类变量
    myclass.val = 50;     //赋值字段
    temp=20;         //赋值int参数
  }

  /// <summary>
  /// 方法调用
  /// </summary>
  static void Main()
  {
    MyClass my = null;
    int temp;
    FuncData(out my,out temp);//调用方法
  }

  static void FuncTest(out int value)
  {
    var test = value+1;//错误,在方法赋值之前无法读取输出变量
  }
}

4、参数数组

  ·在一个参数列表中只能有一个参数数组

  ·如果有,它必须是列表中的最后一个

  声明一个参数数组必须做的事

  ·在数据类型前使用Params修饰符

  ·在数据类型后放置一组空的方括号


/// <summary>
/// 声明方法
/// </summary>
/// <param name="Array">参数</param>
static void FuncTest(params int[] Array)
{
  ...
}

  · 数组是一组整齐的相同类型的数据项

  · 数组使用一个数字索引进行访问

  · 数组是一个引用类型,因此它的所有数据项都保存在堆中

三、C#中方法参数ref和out区别

   1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化

   2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字,以满足匹配。

   3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。


class TestApp
{
  static void outTest(out int x, out int y)
  {
    //离函数前必须xy赋值否则报错
    //y = x;
    //上面行报错使用outxy都清空需要重新赋值即使调用函数前赋值行
    x = 1;
    y = 2;
  }

  static void refTest(ref int x, ref int y)
  {
    x = 1;
    y = x;
  }

  public static void Main()
  {
    //正确 (out test)
    int a, b;
    //out使用前变量赋值
    outTest(out a, out b);
    Console.WriteLine("a={0};b={1}", a, b);
    //在使用out关键字时,不需要在此处初始化,初始化也不会影响到方法内部的值,所以你初始化没用
    int c = 11, d = 22;
    outTest(out c, out d);
    Console.WriteLine("c={0};d={1}", c, d);

    //错误 (ref test)
    int m, n;
    refTest(ref m, ref n);
    //上面行错ref使用前变量必须赋值

    //正确(ref test)
    int o = 11, p = 22;
    refTest(ref o, ref p);
    Console.WriteLine("o={0};p={1}", o, p);
  }
}