ref,in,out

发布时间 2023-08-07 12:46:04作者: 乐天--

ref,in,out

// 不能将in,ref,out关键字用于以下方法:
//异步方法,通过使用async修饰符定义
//迭代器方法,包括yield return 或yield break语句
//扩展方法的第一个参数不能有in修饰符,除非该参数是结构
//扩展方法的第一个参数,其中该参数是泛型类型

img

  • ref
    • img
          // ref 和In类似,但是参数是可以修改的
          // 1.用于将变量传递给方法,并允许该方法更改变量的值,
          // 2.使用ref关键字可以把变量作为指针传递,从而在方法内部对其修改
          public class RefClass
          {
              public static unsafe void Init()
              {
                  //int num; //报错
                  // 使用ref时的参数必须初始化并赋值
                  int num = 10;
                  Increment(ref num);
      
                  int a = 1;
                  ref int c = ref a;
                  Console.WriteLine(c);
      
                  c = 12;
                  Console.WriteLine(c);
      
                  // 方法内部的改变,方法外面的参数也会改变
                  Increment(ref c);
      
                  Console.WriteLine(c);
      
                  // 所有引用类型都是指针的包装器,因此通过引用类型标记为ref,可以将该类型视为指针,对其操作
                  string value = "zhangsan";
                  string* pValue = &value;
      
                  MethodTest(ref *pValue);
              }
      
              static void Increment(ref int x)
              {
                  x++;
                  // ref表示用于返回一个变量的引用
                  Console.WriteLine(x);
              }
      
              static ref int IncrementArrayRef(int[] array)
              {
                  return ref array[0];
              }
      
              //static ref int IncrementNumRef(ref int num)
              //{
              //    // 返回值不能是null,常量,必须是变量
              //    // 返回值不能是方法内部定义的局部变量,可用的返回值可以来自静态字段,ref修饰的方法参数,数组参数的成员等
              //    //return ref num++;
              //}
      
              /// <summary>
              /// ref 表示指定该方法的参数是一个引用类型
              /// </summary>
              /// <param name="str"></param>
              /// <returns></returns>
              static ref string MethodTest(ref string str)
              {
                  // ref表示用于返回一个变量的引用
                  Console.WriteLine(str);
                  return ref str;
              }
          }
      
  • in
    • 允许参数以引用传递的方式给到方法中,本参数只能读取,不能赋值
          // in 会导致按引用传递参数,但确保未修改参数(无法通过调用的方法进行修改)
          int num = 1;
          string underFindStr;
      
          void InUnderFindTest(in string underFindStr)
          {
              Console.WriteLine(underFindStr);
          }
      
          void InTest(in int num)
          {
              Console.WriteLine(num);
              //只读变量,不能修改,报错
              //num = 1;
          }
      
  • out
    • 允许参数以引用传递的方式给到方法中,进入方法后,参数值被清空,必须重新赋值后使用
      // result可不赋值,但是用之前必须赋值 如 result=result +2 会报错 
      // out 和In类似,但参数必须由调用方的方法进行修改
      void OutTest(out int result, int a, int b)
      {
          result = a + b;
          Console.WriteLine(result);
      }