C#、ASP.NET中ref和out的区别

原创 2012年03月23日 23:36:38

这两个数据类型是我们在学习C#语言的过程中数据比较难的两个数据类型,不过他们很重要,所以有必要拿出来说说他们的使用方法和不同之处,希望对你有所帮助。

先总的来说

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

ref与out之间的区别整理

ref和out都是C#中的关键字,所实现的功能也差不多,都是指定一个参数按照引用传递。 对于编译后的程序而言,它们之间没有任何区别,也就是说它们只有语法区别。 总结起来,他们有如下语法区别:  ...
  • xiaoning8201
  • xiaoning8201
  • 2011年10月21日 10:39
  • 8545

C#中方法参数 ref 与 out 的区别

方法中参数的类型有三种 in型参数 in型参数通过值传递的方式将数值传入方法中。即我们在Java中常见的方法 ref型参数 该种类型的参数传递变量地址给方法(引用传递),传递前变量必须初始化。 ...
  • jl1134069094
  • jl1134069094
  • 2016年01月13日 17:25
  • 1008

c# ref out 区别 比较 汇总

ref(C# 参考) Visual Studio 2015 其他版本   ref 关键字会导致参数通过引用传递,而不是通过值传递。 通过引用传递的效果...
  • hejisan
  • hejisan
  • 2016年07月06日 00:05
  • 706

在C#中 ref和out的区别

在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键字都能够提供相似的功...
  • unity_http
  • unity_http
  • 2016年07月15日 20:36
  • 1436

C#中in,out,ref的作用和区别

ref和out的区别在C# 中,既可以通过值也可以通过引用传递参数。通过引用传递参数允许函数成员更改参数的值,并保持该更改。若要通过引用传递参数, 可使用ref或out关键字。ref和out这两个关键...
  • jadeflute
  • jadeflute
  • 2010年01月20日 22:13
  • 23289

解析.net中ref和out的实质(高手勿进)

Normal 0 7.8 磅 0 2 false false false Microsof...
  • fuadam
  • fuadam
  • 2008年08月29日 15:58
  • 2053

C# out、ref关键字的用法和区别

说说自己对out、ref的认识,面试问到的几率很高哟。 out: class Program { /* * out、ref都是引用传递,传递后使用...
  • CommandBaby
  • CommandBaby
  • 2016年04月06日 14:53
  • 3863

c#中的关键字out是什么意思?ref是什么意思?它们有什么区别?

不知大家有没有遇到过需要一个函数返回多个值的情况。 当写代码要返回多个值的时候,当然可以返回一个数组来实现,但如果遇到需要返回的多个值的类型不同呢?这个时候怎么办? c#中,out关键字和ref关...
  • sinat_23079759
  • sinat_23079759
  • 2016年10月22日 22:14
  • 2252

ref和out的作用和区别

相同点:方法的定义和调用都必须显示使用ref、out关键字。都会导致参数按引用传递。 不同点:传递给ref关键字的参数必须赋初始值,而out不用。out关键字会清空变量,即使变量已经赋值也不行,...
  • fox123871
  • fox123871
  • 2014年08月07日 23:51
  • 1264

C#、ASP.NET中ref和out的区别

这两个数据类型是我们在学习C#语言的过程中数据比较难的两个数据类型,不过他们很重要,所以有必要拿出来说说他们的使用方法和不同之处,希望对你有所帮助。先总的来说:通常我们向方法中传递的是值.方法获得的是...
  • nanyida0416sushe
  • nanyida0416sushe
  • 2010年05月21日 17:41
  • 3766
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#、ASP.NET中ref和out的区别
举报原因:
原因补充:

(最多只允许输入30个字)