zoukankan      html  css  js  c++  java
  • ref, out参数区别

    一直受困于ref 和 out 区别,却总是想不起来一探究竟,今天终于有机会再来探讨这个问题了,就没有再犹豫,直接利用资源过来找了

    ref: 在调用这样的方法前,必须对ref这个参数初始化或者赋值
        这个ref 的参数,可以在方法内部对其进行重新赋值,可选动作
    out: 在调用这样的方法前,可以不对这个参数进行初始化或赋值
        这个out 的参数,必须在方法内部对其进行重新赋值,必选动作

    下面的内容为google来的,上面的则是转换成自己的语言,虽然有些不能听懂,呵呵

    先总的来说:

           通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不将受到影响.此外我们还有其他向方法传递参数的形式,引用(ref)和输出(out).

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

           Ref指明了方法中使用的是引用型参数,引用型参数不开辟新的内存区域。当利用引用型参数向方法传递形参时,编译程序将把实际值在内存中的地址传递该方法。引用型参数通常已经初始化。   
      
       
      int   i=1,j=2;//
    初始化   
      Swap(ref   i,ref   j);   
        
       Out
    输出型参数也不开辟新的内存区域,但与引用型参数不同的是,调用方法之前无需对变量进行初始化,输出型参数主要用于传递方法返回的数据。   
      string   name,path;//
    没有初始化   
      File(out   name,out   path);

     

    首先先说ref:(MSDN)

    C# 关键字 | 方法参数

           方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必显式初始化。

     

    属性不是变量,不能作为 ref out参数传递。

     

    如果两种方法的声明仅在它们对 ref 的使用方面不同,则将出现重载。但是,无法定义仅在 ref  out 方面不同的重载。例如,以下重载声明是有效的:

     

    class MyClass 

    {

    public void MyMethod(int i) {i = 10;}

    public void MyMethod(ref int i) {i = 10;}

    }

    但以下重载声明是无效的:

    class MyClass 

    {

    public void MyMethod(out int i) {i = 10;}

    public void MyMethod(ref int i) {i = 10;}

    }

     

    示例

    using System;

    public class MyClass 

    {

    public static void TestRef(ref char i) 

    {

    // The value of i will be changed in the calling method

    i = 'b';

    }

     

    public static void TestNoRef(char i) 

    {

    // The value of i will be unchanged in the calling method

    i = 'c';

    }

     

    public static void Main() 

    {

    char i = 'a'; // variable must be initialized

    TestRef(ref i); // the arg must be passed as ref

    Console.WriteLine(i);

    TestNoRef(i);

    Console.WriteLine(i);

    }

    }

    输出

    b

    b

     

    这里为你说out:

    C# 关键字 | 方法参数

           方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可以有一个以上的 out 参数。若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

     

           如果两个方法的声明仅在 out 的使用方面不同,则会发生重载。不过,无法定义仅在 ref  out 方面不同的重载。例如,以下重载声明是有效的:

     

    class MyClass 

    {

    public void MyMethod(int i) {i = 10;}

    public void MyMethod(out int i) {i = 10;}

    }

    而以下重载声明是无效的:

     

    class MyClass 

    {

    public void MyMethod(out int i) {i = 10;}

    public void MyMethod(ref int i) {i = 10;}

    }

    using System;

    public class MyClass 

    {

    public static int TestOut(out char i) 

    {

    i = 'b';

    return -1;

    }

     

    public static void Main() 

    {

    char i; // variable need not be initialized

    Console.WriteLine(TestOut(out i));

    Console.WriteLine(i);

    }

    }

    输出

    -1

    B

     

    params 关键字可以指定在参数数目可变处采用参数的方法参数。 

    在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字 

    using System; 
    public class MyClass 

    public static void UseParams(params int[] list) 

    for ( int i = 0 ; i < list.Length ; i++ ) 
    Console.WriteLine(list[i]); 
    Console.WriteLine(); 


    public static void UseParams2(params object[] list) 

    for ( int i = 0 ; i < list.Length ; i++ ) 
    Console.WriteLine(list[i]); 
    Console.WriteLine(); 


    public static void Main() 

    UseParams(1, 2, 3); 
    UseParams2(1, 'a', "test"); 

    int[] myarray = new int[3] {10,11,12}; 
    UseParams(myarray); 


    输出 






    test 

    10 
    11 
    12

  • 相关阅读:
    【Codeforces 349B】Color the Fence
    【Codeforces 459D】Pashmak and Parmida's problem
    【Codeforces 467C】George and Job
    【Codeforces 161D】Distance in Tree
    【Codeforces 522A】Reposts
    【Codeforces 225C】Barcode
    【Codeforces 446A】DZY Loves Sequences
    【Codeforces 429B】Working out
    【Codeforces 478C】Table Decorations
    【Codeforces 478C】Table Decorations
  • 原文地址:https://www.cnblogs.com/forward/p/954289.html
Copyright © 2011-2022 走看看