zoukankan      html  css  js  c++  java
  • 方法参数:值参数、引用参数、输出参数

    本文引用于:http://www.cnblogs.com/scottckt/archive/2008/04/07/1140752.html

    一、參數的使用方法:
        1、值參數(Value Parameter )
            格式:方法名稱(參數類型 參數名稱[,參數類型 參數名稱])

        2、引用參數(Reference Parameter )
            格式:方法名稱(ref 參數類型 參數名稱[,ref 參數類型 參數名稱])

        3、輸出參數(Out Parameter)
            格式:方法名稱(out  參數類型 參數名稱[,out  參數類型 參數名稱])

    二、值參數與引用參數及輸出參數的區別:
        2.1 值參數中實參的值不隨形參值變更而變更;
              形參與實參值互不影響,實參傳遞給形參時,堆棧中就為其分配另外一部分空間。這樣,兩個參數變更時而互不影響。
        2.2 引用參數及輸出參數中實參的值會隨形參值變更而變更
             (形參:在定义函数中指定的形参,在未出现函数调用时,它们并不占内存中的存储单元.只有在发生函数调用时,函数中形参才被分配内存单元.在调用结束后,形参所占的内存单元也被释放。调用时将实参的值赋绐形参);
              引用參數與輸出參數中,實參在堆棧中分配空間。當實參傳遞給形參時,會將地址傳遞給形參,即傳送的是指針,這樣形參變更時,實參也會隨著變更。

    三、引用參數與輸出參數區別:
         3.1 使用ref與out參數時,方法中參數及調用參數都需要加Ref或out關鍵字
         3.2 使用ref參數與out參數得到的結果是一樣的,區別是:ref在調用前需給調用方法中的參數賦初值。out在調用前不需給調用方法中的參數賦初值,參數在實際方法體中初始化。

    四:查看代碼

    如:下面代碼中各個參數的結果:
    using System;
    class mahod
    {
        
    public static void ValueMethod(int i)
        {
            i
    ++;
        }
        
    public static void ReferenceMehtod(ref int i)
        {
            i
    ++;
        }
        
    public static void OutMethod(out int j)
        {
            j
    =0;
            j
    ++;
        }
        
        
    static void Main()
        {
            
    int i=0;
            ValueMethod(i);
            Console.WriteLine(
    "i="+i);
            
    int j=0;
            ReferenceMehtod(
    ref j);
            Console.WriteLine(
    "j="+j);
            
    int k;
            OutMethod(
    out k);
            Console.WriteLine(
    "k="+k);
            
            Console.ReadLine();
        }
    }

         有时,我们需要改变原来变量中的值,这时,我们可以向方法传递变量的引用,而不是变量的值.引用是一个变量,他可以访问原来变量的值,修改引用将修改原来变量的值.变量的值存储在内存中,可以创建一个引用,他指向变量在内存中的位置.当引用被修改时,修改的是内存中的值,因此变量的值可以将被修改.当我们调用一个含有引用参数的方法时,方法中的参数将指向被传递给方法的相应变量,因此,我们会明白,为什么当修改参数变量的修改也将导致原来变量的值.

     private int r1(int i)
    {
          i = i * i;
          return i;
    }

    private int r2(ref int i) //引用参数
    {
          i = i * i;
          return i;
    }

    //调用:
    int m = 3; //必须赋值
    int n = 0; //可以不赋值 int n;
    n = r1(m); //m=3 n=9

    n = r2(ref m); //m=9(被修改了) n=9
    //ref参数之前必须先赋值


    //out:
    private void  r1(int i,out int j,out int k) //private void  r1(ref int i,out int j,out int k)
    {
          j=i*10;
          k = j * 20;
    }

    //调用:
    int x = 1;//必须赋值
    int y = 0;//or:int y; 可以不赋值
    int z = 0;//or:int z;可以不赋值
    r1(x, out y, out z); //x=1  y=10  z=200


    //ref和out的区别:
    1、ref和out似乎可以实现相同的功能.因为都可以改变传递到方法中的变量的值.
         但是,二者本质本质的区别就是,ref是传入值,out是传出值.

    2、ref参数之前必须先赋值

    3、在含有out关键字的方法中,out变量必须由该方法参数中非out(可以是ref)变量赋值或者由全局变量赋值。

    4、out的宗旨是保证每一个传出变量都必须被赋值。

    5、out参数在调用方法前可以不初始化变量。

    6、而ref参数,在传递给方法时,就已经是含有值的了,所以ref侧重修改.out侧重输出。

  • 相关阅读:
    1062 Talent and Virtue (25 分)
    1083 List Grades (25 分)
    1149 Dangerous Goods Packaging (25 分)
    1121 Damn Single (25 分)
    1120 Friend Numbers (20 分)
    1084 Broken Keyboard (20 分)
    1092 To Buy or Not to Buy (20 分)
    数组与链表
    二叉树
    时间复杂度与空间复杂度
  • 原文地址:https://www.cnblogs.com/perfect/p/1207449.html
Copyright © 2011-2022 走看看