百科狗-知识改变命运!
--

c# ref和out区别仅仅是参数需不需要初始化?

小肉包1年前 (2023-12-15)阅读数 8#综合百科
文章标签参数方法

ref和out使用时的区别是:

①:ref指定的参数在函数调用时候必须初始化,不能为空的引用。而out指定的参数在函数调用时候可以不初始化;

②:out指定的参数在进入函数时会清空自己,必须在函数内部赋初值。而ref指定的参数不需要。

一:ref 关键字使参数按引用传递。

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

也即是说,在方法中对参数的设置和改变将会直接影响函数调用之处(代码①及②)。无论是函数的定义还是调用时均不可忽略关键字ref.

二:ref定义的参数在使用前必须初始化,无论在函数定义时候参数有没有赋予初值。这条正好区分out指定的参数可以不在调用函数的时候进行初始化。

三 :对out来说,第一条同样适用。将代码①以及②中的ref全部修改成out,则可与使用ref得到同样的结果。

四:out指定的参数必须在函数定义的时候就赋初值。否则则出现错误。对比ref指定的参数则可以不在函数内部进行赋初值,在函数调用时候再赋初值也可以。

c#.net中参数修饰符ref,out ,params得区别?

ref(C# 参考)

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

}

}

传递到 ref 参数的参数必须最先初始化。这与 out 不同,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 和 out 传递数组。

示例

按引用传递值类型(如上所示)是有用的,但是 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;

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 参数传递。

有关传递数组的信息,请参见使用 ref 和 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;

c# ref和out区别仅仅是参数需不需要初始化?

}

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 关键字可以指定在参数数目可变处采用参数的方法参数。

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

示例

// cs_params.cs

using System;

public class MyClass

{

public static void UseParams(params int[] list)

{

for ( int i = 0 ; i

Console.WriteLine(list[i]);

Console.WriteLine();

}

public static void UseParams2(params object[] list)

{

for ( int i = 0 ; 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);

}

}

输出

1

2

3

1

a

test

10

11

12

===============================================

方法参数上的 out 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

当希望方法返回多个值时,声明 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;}

}

有关传递数组的信息,请参见使用 ref 和 out 传递数组。

示例

// cs_out.cs

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

========================================

方法参数上的 ref 方法参数关键字使方法引用传递到方法的同一个变量。当控制传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中。

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

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

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

如果两种方法的声明仅在它们对 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;}

}

有关传递数组的信息,请参见使用 ref 和 out 传递数组。

示例

// cs_ref.cs

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';

}

// This method passes a variable as a ref parameter; the value of the

// variable is changed after control passes back to this method.

// The same variable is passed as a value parameter; the value of the

// variable is unchanged after control is passed back to this method.

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

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)