吴佳鑫的个人专栏

当日事当日毕,没有任何借口

导航

params,ref,out关键字

参数数组params:
c#允许为函数指定一个(只能指定一个)特定的参数,这个参数必须是函数定义中的最后一个参数,称为参数

数组。参数数组可以使用个数不定的参数调用函数,它可以使用params关键字来定义。

特点
1,在方法成员的参数列表中使用,为该方法提供了参数个数可变的能力
2,该参数必须是一个一维数组
3,params 关键字可以指定在参数数目可变处采用参数的方法参数。
4,在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允许一个 params 关键字。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] intArr = { 1, 2, 3, 4, 5 };
            UseParams("Hello ",intArr);
            UseParams("world",6, 7, 8);
            Console.ReadLine();
        }

        static void UseParams(string strMsg, params int[] list)
        {
            Console.WriteLine(strMsg);
            for (int i = 0; i < list.Length; i++)
            {
                Console.Write(list[i] + " ");
            }
            Console.WriteLine();
        }

    }
}
输出结果:
Hello
1 2 3 4 5
world
6 7 8


引用参数ref 输出参数out
C#中既可以通过值传递参数,也可以通过引用传递参数。通过引用传递参数,允许方法内成员改变参数的值,

并保持更改。若要通过引用传递参数,可以使用ref和out关键字。ref和out的功能相当于C中的指针。
  ref和out都可以使参数按引用方式传递,但两者有一定的区别。
  1.ref传递参数时必须先初始化,而out传递参数时不需要事先初始化,但必须在方法中初始化。
  2.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。
  3.使用ref和out,在使用和定义方法时,参数之前都必须使用ref或out参数,对应起来。

 

ref
ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将

反映在该变量中。

若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。
传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。
属性不是变量,因此不能作为 ref 参数传递。
尽管 ref 和 out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用

ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两

个方法是完全相同的。如果尝试这么做,将导致不能编译该代码。
如果一个方法采用 ref 或 out 参数,而另一个方法不采用这两类参数,则可以进行重载。
示例:

按引用传递值类型是有用的,但是 ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引

用的对象,因为引用本身是按引用来传递的。

// keywords_ref.cs

using System;

class App
{
    public static void UseRef(ref int i)
    {
        i += 100;
        Console.WriteLine("i = {0}", i);
    }

    static void Main()
    {
        int i = 10;

        // 查看调用方法之前的值
        Console.WriteLine("Before the method calling: i = {0}", i);

        UseRef(ref i);

        // 查看调用方法之后的值
        Console.WriteLine("After the method calling: i = {0}", i);
        Console.Read();
    }
}

/**//*
控制台输出:
Before the method calling : i = 10
i = 110
After the method calling: i = 110
*/

 


out
out 关键字会导致参数通过引用来传递。这与 ref 关键字类似。

与 ref 的不同之处:

ref 要求变量必须在传递之前进行初始化。
尽管作为 out 参数传递的变量不需要在传递之前进行初始化,但需要调用方法以便在方法返回之前赋值。
示例:

与 ref 示例不同的地方只要将 ref 改为 out,然后变量 i 仅需要声明即可。

static void Main()
{
    //int i = 10; 改为
    int i;
    //
}

 

 

C# ref与out区别
在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更

改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功效,其作用

也很像C中的指针变量。它们的区别是:

1、使用ref型参数时,传入的参数必须先被初始化。对out而言,必须在方法中对其完成初始化。

2、使用ref和out时,在方法的参数和执行方法时,都要加Ref或Out关键字。以满足匹配。

3、out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候。

 


注:在C#中,方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output

),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out

,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法

调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数

的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传

值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是

同一个存储位置。

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中

对参数所做的任何更改都将反映在该变量中。

若要使用 ref 参数,必须将参数作为 ref 参数显式传递到方法。ref 参数的值被传递到 ref 参数。

传递到 ref 参数的参数必须最先初始化。将此方法与 out 参数相比,后者的参数在传递到 out 参数之前不必

显式初始化。

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

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

不同的重载。

out

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中

对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 out 方法非常有用。使用 out 参数的方法仍然可以返回一个值。一个方法可

以有一个以上的 out 参数。

若要使用 out 参数,必须将参数作为 out 参数显式传递到方法。out 参数的值不会传递到 out 参数。

不必初始化作为 out 参数传递的变量。然而,必须在方法返回之前为 out 参数赋值。

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

posted on 2010-01-14 11:35  _eagle  阅读(380)  评论(0编辑  收藏  举报