zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    401. Binary Watch
    46. Permutations
    61. Rotate List
    142. Linked List Cycle II
    86. Partition List
    234. Palindrome Linked List
    19. Remove Nth Node From End of List
    141. Linked List Cycle
    524. Longest Word in Dictionary through Deleting
    android ListView详解
  • 原文地址:https://www.cnblogs.com/wecc/p/11385157.html
Copyright © 2011-2022 走看看