方法参数(params,ref,out)

本文详细介绍了C#中参数传递的几种方式,包括params、ref和out关键字的使用方法及注意事项,通过示例展示了如何利用这些关键字实现参数的灵活传递。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果在为方法声明参数时未使用 ref out,则该参数可以具有关联的值。可以在方法中更改该值,但当控制传递回调用过程时,不会保留更改的值。通过使用方法参数关键字,可以更改这种行为。

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C06%5Cclip_filelist.xml">

本节描述声明方法参数时可以使用的关键字:

·         params

·         ref

·         out

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_filelist.xml"> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C02%5Cclip_editdata.mso">

paramsC# 参考)

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

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

 示例

// cs_params.cs

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();

    }

 

    static void Main ()

    {

        UseParams(1, 2, 3);

        UseParams2(1, 'a', "test");

 

        // An array of objects can also be passed, as long as

        // the array type matches the method being called.

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

        UseParams(myarray);

    }

}

输出

1

2

3

 

1

a

test

 

10

11

12

rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C04%5Cclip_filelist.xml">

refC# 参考)

ref 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字。例如:


class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}
rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml"> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_editdata.mso">

传递到 ref 参数的参数必须最先初始化。这与 out 不同,out 的参数在传递之前不需要显式初始化。



尽管 ref out 在运行时的处理方式不同,但它们在编译时的处理方式是相同的。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:



class CS0663_Example



{



    // compiler
error CS0663: "cannot define overloaded



    // methods that
differ only on ref and out"



    public void
SampleMethod(ref int i) {  }



    public void SampleMethod(out
int i) {  }



}


但是,如果一个方法采用 ref out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:


class RefOutOverloadExample


{


    public void
SampleMethod(int i) {  }


    public void
SampleMethod(ref int i) {  }


}


 备注


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


 示例


按引用传递值类型(如上所示)是有用的,但是
ref 对于传递引用类型也是很有用的。这允许被调用的方法修改该引用所引用的对象,因为引用本身是按引用来传递的。下面的示例显示出当引用类型作为
ref 参数传递时,可以更改对象本身。


class RefRefExample


{


    static void
Method(ref string s)


    {


        s =
"changed";


    }


    static void Main ()


    {


        string str
= "original";


        Method(ref
str);


        // str is
now "changed"


    }


}


rel="File-List" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_filelist.xml"> rel="Edit-Time-Data" href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C03%5Cclip_editdata.mso">

out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字。例如:



class OutExample



{



    static void Method(out int i)



    {



        i = 44;



    }



    static void Main ()



    {



        int value;



        Method(out value);



        // value is
now 44



    }



}



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



ref out 关键字在运行时的处理方式不同,但在编译时的处理方式相同。因此,如果一个方法采用 ref 参数,而另一个方法采用 out 参数,则无法重载这两个方法。例如,从编译的角度来看,以下代码中的两个方法是完全相同的,因此将不会编译以下代码:



class CS0663_Example



{



    // compiler
error CS0663: "cannot define overloaded



    // methods that
differ only on ref and out"



    public void
SampleMethod(out int i) {  }



    public void
SampleMethod(ref int i) {  }



}



但是,如果一个方法采用 ref out 参数,而另一个方法不采用这两类参数,则可以进行重载,如下所示:



 



class RefOutOverloadExample



{



    public void
SampleMethod(int i) {  }



    public void
SampleMethod(out int i) {  }



}



 备注



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



 示例



当希望方法返回多个值时,声明
out 方法很有用。使用 out 参数的方法仍然可以将变量用作返回类型(请参见 return),但它还可以将一个或多个对象作为 out 参数返回给调用方法。此示例使用 out 在一个方法调用中返回三个变量。请注意,第三个参数所赋的值为 Null。这样便允许方法有选择地返回值。



class OutReturnExample



{



    static void
Method(out int i, out string s1, out string s2)



    {



        i = 44;



        s1 =
"I've been returned";



        s2 = null;



    }



    static void Main ()



    {



        int value;



        string
str1, str2;



        Method(out
value, out str1, out str2);



        // value is
now 44



        // str1 is
now "I've been returned"



        // str2 is
(still) null;



    }



}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值