ref 与 out 做为参数调用时的区别

wt_sanlian 2003-03-06 12:47:02
ref 与 out 都可以做为方法的参数修饰符,
将参数的引用传给方法,
ref 类形的参数调用之前需要初始化,
out类型的参数不需要初始化,
仅有这点区别吗?
那么要ref关键字岂不是有些多余?

...全文
29 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wt_sanlian 2003-03-06
  • 打赏
  • 举报
回复
怎么在c#版看不到我的帖子?
wt_sanlian 2003-03-06
  • 打赏
  • 举报
回复
谢谢!

传值与传引用我能理解,ref与out都是引用进去的。
为什么c#不将ref与out类型合并呢,只要在做赋值检查时,
对ref类型参数不加赋值检查,不就可以了吗?
是不是out类型还有其它用途呢?
lifeis 2003-03-06
  • 打赏
  • 举报
回复
http://www.microsoft.com/china/msdn/cornyfield6.asp
lifeis 2003-03-06
  • 打赏
  • 举报
回复
在传值和传址情况下,C#强制要求参数在传入之前由用户明确初始化,否则编译器报错!但我们如果有一个并不依赖于参数初值的函数,我们只是需要函数返回时得到它的值是该怎么办呢?往往在我们的函数返回值不至一个时我们特别需要这种技巧。答案是用out修饰的输出参数。但需要记住输出参数与通常的函数返回值有一定的区别:函数返回值往往存在堆栈里,在返回时弹出;而输出参数需要用户预先制定存储位置,也就是用户需要提前声明变量--当然也可以初始化。看下面的例子:

using System;
class Test
{
static void ResoluteName(string fullname,out string firstname,out string lastname)
{
string[] strArray=fullname.Split(new char[]{' '});
firstname=strArray[0];
lastname=strArray[1];
}
public static void Main()
{
string MyName="Cornfield Lee";
string MyFirstName,MyLastName;

ResoluteName(MyName,out MyFirstName,out MyLastName);

Console.WriteLine("My first name: {0}, My last name: {1}",
MyFirstName, MyLastName);
}
}

程序经编译后执行输出:

My first name: Cornfield, My last name: Lee
在函数体内所有输出参数必须被赋值,否则编译器报错!out修饰符同样应该应用在函数声明和调用两个地方,除了充当返回值这一特殊的功能外,out修饰符ref修饰符有很相似的地方:传址。我们可以看出C#完全摈弃了传统C/C++语言赋予程序员莫大的自由度,毕竟C#是用来开发高效的下一代网络平台,安全性--包括系统安全(系统结构的设计)和工程安全(避免程序员经常犯的错误)是它设计时的重要考虑,当然我们看到C#并没有因为安全性而丧失多少语言的性能,这正是C#的卓越之处,“Sharp”之处!

数组参数也是我们经常用到的一个地方--传递大量的数组集合参数。我们先看下面的例子:

using System;
class Test
{
static int Sum(params int[] args)
{
int s=0;
foreach(int n in args)
{
s+=n;
}
return s;
}
static void Main()
{
int[] var=new int[]{1,2,3,4,5};
Console.WriteLine("The Sum:"+Sum(var));
Console.WriteLine("The Sum:"+Sum(10,20,30,40,50));
}
}

lifeis 2003-03-06
  • 打赏
  • 举报
回复
方法的参数传递有四种类型:传值(by value),传址(by reference),输出参数(by output),数组参数(by array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。看下面的例子及其输出:
wt_sanlian 2003-03-06
  • 打赏
  • 举报
回复
out 是什么样的呢,请赐教
三块三 2003-03-06
  • 打赏
  • 举报
回复
ref是用的指针方式,并未将整个对象全丢过去,而OUT则不然

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧