您的位置:首页 > 编程语言 > C#

C#中参数前缀ref、out的使用

2012-07-27 13:52 295 查看
一、使用ref、out前缀与不使用前缀的区别

int intParam = 0;

object objParam = null;

public void method(int intParam,object objParam) //intParam是值类型形参, objParam是引用类型形参

{

//do something.....

}

public void Main()

{

method(intParam,objParam) ; //intParam是值类型实参, objParam是引用类型实参

}

不使用前缀时,向方法传递一个实参时,对应的形参会使用实参的一个副本来初始化。对于值类型的实参副本等于该值本身,而对于引用类型的实参副本则等于引用变量的值。 如果为一个形参附加了ref关键字,该参数就会成为实参的一个别名,而不再是实参的一个副本。

二、ref、out的区别

使用ref的参数必须先赋值,out的可以不初始化参数。其余的作用相同。

三、ref应用于引用类型的参数

对于引用类型的参数,加ref前缀,传递的是原引用变量的引用,如果你在方法体内对形参重新赋值,那么将影响到实参,即形参和实参的引用是同一地址;不加ref前缀,传递的是原引用变量的副本,即使你在方法体内对形参重新赋值,不影响实参,即形参和实参的引用是不同的。

示例:


using System;
using System.Collections.Generic;
using System.Text;

namespace Parameters
{
class WrappedInt
{
public int number;

}
class Pass
{
public static void Value(ref int param)
{
param = 10;
}
//使用引用类型的参数,方法体内不对参数的引用做任何修改
public static void Reference(WrappedInt param)
{
param.number = 50;
}
//使用加了ref修饰符的引用类型的参数,方法体内对参数的引用做了修改
//由于使用了ref修饰符,所以将影响到实参。
public static void refReference(ref WrappedInt param)
{
WrappedInt wi = new WrappedInt();
wi.number = 100;
param = wi;
}
//使用未加ref修饰符的引用类型的参数,方法体内对参数的引用做了修改
public static void NorefReference(WrappedInt param)
{
WrappedInt wi = new WrappedInt();
wi.number = 100;
param = wi;
}
}
class Program
{
static void DoWork()
{
WrappedInt reParam = new WrappedInt();

Console.WriteLine(reParam.number);
Pass.Reference(reParam);       //使用引用类型变量,实参和方法体内的形参引用的是同一个地址。
Console.WriteLine(reParam.number);
Pass.NorefReference(reParam); //未使用ref修饰符,虽然在方法体内修改了形参的引用,但不影响实参reParam
Console.WriteLine(reParam.number);
Pass.refReference(ref reParam); //由于使用了ref修饰符,在方法体内修改了形参的引用将影响到实参reParam。
Console.WriteLine(reParam.number);
}

static void Main(string[] args)
{
try
{
DoWork();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: