(C#)方法参数关键字:ref、out、params详解

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ref(C# 参考)

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

class RefExample

{

static void Method(ref int i)

{

i = 44;

}

static void Main()

{

int val = 0; //使用ref val必须先初始化

Method(ref val);

// val is now 44

}

}

传递到 ref 参数的参数必须最先初始化。这与 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"

}

}

out(C# 参考)

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

class OutExample

{

static void Method(out int i)

{

i = 44;

}

static void Main()

{

int value; //使用out ,value不必初始化

Method(out value);

// value is now 44

}

}

属性不是变量,因此不能作为 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;

}

}

params(C# 参考)

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

}

相关文档
最新文档