• C#的params、ref、out关键字


    • [ref关键字]

      一般的方法调用---值参数


      值参数:在使用参数时,是把一个值传递给函数。在函数中,对此变量的任何修改都不影响函数调用中使用的参数。

      static void showDouble(int val)
      {
      val*=2;
      WriteLine($"val doubled ={val}");
      }

      参数在val在这个函数中被加倍,如果在Main函数中按如下方式调用它:

      int myNumber = 5;
      WriteLine($"myNumber = {myNumber}")
      ShowDouble(myNumber);
      WriteLine($"myNumber = {myNumber}")

      控制台输出:

      myNumber = 5;
      val doubled = 10;
      myNumber = 5;

      把myNumber作为一个参数,调用ShowDouble并不影响Main()中myNumber的值,即使把myNumber赋值给val后再将val加倍,myNumber的值也不变;如果我想改变myNumber的值,该方法调用,就满足不了需求了,因此传统的做法是,使用一个为myNumber返回新值的函数。如下:

    使用一个为myNumber返回新值的函数

    static int DoubleNum(int val)
    {
    val*=2;
    return val;
    }
    

    在Main函数中按如下方式调用它:

    int myNumber = 5;
    WriteLine($"myNumber = {myNumber}")
    myNumber = DoubleNum(myNumber);
    WriteLine($"myNumber = {myNumber}") 
    

    虽然这段代码为myNumber返回了新值,但不能改变用作参数的多个变量值(函数只有一个返回值),下面为进一步解决问题需求:可以通过“引用传递参数”,即函数处理的变量和函数调用中使用的变量相同,而不仅仅是值相同的变量,对这个变量进行任何的改变都会影响用作参数的变量值

    引入ref关键字---用途一:用作函数参数

    static void showDouble(ref int val)
    {
    val*=2;
    WriteLine($"val doubled ={val}");
    }
    

    在Main函数中按如下方式调用它:

    int myNumber = 5;
    WriteLine($"myNumber = {myNumber}")
    showDouble(ref myNumber);
    WriteLine($"myNumber = {myNumber}") 
    

    注意点:用作ref参数的变量有两个限制:一,要是非常量的变量;二,要是初始化过的变量

    引入ref关键字---用途二:用作局部变量

    int myNumber = 5;
    ref int myNumberRef = ref myNumber;
    myNumberRef = 6;
    

    此处的myNumberRef引用myNumber,修改myNumberRef也会导致myNumgber发生变化;即将看到两个变量的值都为6

    引入ref关键字---用途二:用作返回类型

    static ref int showDouble(ref int val)
    {
    val*=2;
    return ref val;
    }
    
    • [out关键字]

      一般的方法调用---值参数

      out关键字:指定所给的参数是一个输出参数,out关键字的使用方式与ref关键字相同(在函数调用和函数定义中用作参数的修饰符),在函数执行完毕后,该参数的值将返回给函数调用中使用的变量;
      与ref关键字的区别:
      把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数;在函数使用out参数时,必须把它看作尚未赋值。
      即调用代码可以把已赋值的变量用作out参数,但存储在该变量的中保存的值会在函数执行时丢失。

      需求:返回数组中最大的值的maxValue()函数,并获取数组中最大值的元素索引,如果数组中有多个元素的值都是这个最大值,只提取第一个最大值的索引,代码如下所示:

      static int MaxValue(int[] intArray,out int maxIndex)
      {
      int maxVal = intArray[0];
      maxIndex = 0;
      for(int i=1;i<intArray.Length;i++)
      {
      if(intArray[i]>maxVal)
      {
      maxVal = intArray[i];
      maxIndex = i;
      }
      }
      return maxVal;
      }

    Main函数中:

    int[] myArray ={1,3,5,9,6,4,7}
    WriteLine("value is "+$"{MaxValue(myArray,out int maxIndex)}")
    WriteLine("index is"+$"{maxIndex+1}");
    

    还可参考:https://www.cnblogs.com/chenwolong/p/ref.html
    https://www.cnblogs.com/GreenLeaves/p/6843026.html
    https://www.cnblogs.com/vinsonLu/p/3664364.html

  • 相关阅读:
    Intel x86
    FPGA自计数六位共阳极数码管动态显示2(调用task的方法)
    FPGA六位共阳极数码管动态显示
    运算放大器是模拟电路的基石,模拟电路设计
    这样讲你就懂了!大牛给你介绍《信号与系统》
    电容计算公式
    fork...join的用法
    芯片电源管脚的去耦电容究竟要用多大的?
    Blog Contents
    linux grep 命令常见用法
  • 原文地址:https://www.cnblogs.com/wecc/p/11385157.html
Copyright © 2020-2023  润新知