c#中out的作用

tcdddd 2005-09-27 12:14:31
c#中传递参数除了ref还有out,看资料上介绍他们的主要区别就是,前者必须在调用函数之前初始化,后者必须在函数附值,但我觉得ref可以完成out的全部功能,如果需要的话只需在调用函数的时候初始化为null即可,那c#中加入out有什么特殊的用处吗?那位大哥给介绍一下,小弟不胜感激!
...全文
4701 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcdddd 2005-10-15
  • 打赏
  • 举报
回复
结贴喽
JackLucifer 2005-10-09
  • 打赏
  • 举报
回复
mark
LuckyBoy_Bob 2005-10-09
  • 打赏
  • 举报
回复
最简单的理解,相当C中的一个是传值,一个是传地址
Ivony 2005-10-09
  • 打赏
  • 举报
回复
我认为Ivony的例子里最后的Test( i )没有被声明过吧;
另外有一点:out/ref和传值参数之间可以看作函数重载的区别,但是仅仅out和ref的区别对IL是一样的,无法区分重载!


第二条神奇的分隔线下面的代码与上面的是在同一个类里面的,只不过下面的代码写在了某个函数里,我懒得虚构那个函数而已.....神奇的分隔线就是说省掉了一大堆东西.
LGame 2005-10-09
  • 打赏
  • 举报
回复
iheshi 2005-10-08
  • 打赏
  • 举报
回复
http://iheshi.cnblogs.com/articles/132852.html
zhuxiaoke 2005-10-08
  • 打赏
  • 举报
回复
wagada()是正确的,
不行你可以写两个函数,查看IL代码,里面是一样的,我以前看过,好象都会编译成out(不是很确认)了
wagada 2005-10-08
  • 打赏
  • 举报
回复
我认为Ivony的例子里最后的Test( i )没有被声明过吧;
另外有一点:out/ref和传值参数之间可以看作函数重载的区别,但是仅仅out和ref的区别对IL是一样的,无法区分重载!
Ivony 2005-09-30
  • 打赏
  • 举报
回复
为了C#语言的编译检查,在值类型上这一点更能体现.
如:
int i;

int j = i;//Error,变量i没有被初始化。

实际上就是为了这个。

======神奇的分隔线=======



void Test( out int i )
{
int j = i;//Error,变量i没有被初始化。
}

又如:

void Test ( ref int i )
{
int j = i;//正确
}

//=========神奇的分隔线=========

int i;
Test ( i );//Error,变量i没有被初始化。
LMTZ 2005-09-30
  • 打赏
  • 举报
回复
①ref要求参数必须被初始化,out没有这个要求。
②ref参数可以被修改,也可以不被修改,但是out必须被赋值或者修改。
③ref参数值可以在任何时候被调用参数使用,而out参数值只能在被赋值后才可以被使用。
tcdddd 2005-09-30
  • 打赏
  • 举报
回复
Ivony()老兄举的例子不错,
biduan(笔端)同志说:在函数成员内部,引用参数被做为初始已赋值,输出参数视为初始未赋值
你俩是一个意思,一个给出理论,一个给出实践,不错,谢了
tcdddd 2005-09-30
  • 打赏
  • 举报
回复
biduan(笔端) 兄弟说:ref是引用参数,引用参数不创建新的存储位置,引用参数的值总与基础变量相同

out修饰的参数是输出参数,与那个对函数成员调用中当作“自变量”的变量在同一个位置,
参数的值总与基础变量相同
什么基础变量,自变量的,自变量是数学中的概念吧,编程当中我还没听说过呢,麻烦老兄给解释一下基础变量和自变量好吗?你这两句话兄弟是一点没看懂,我开始怀疑自己的智商了,赫赫。
「已注销」 2005-09-30
  • 打赏
  • 举报
回复
ref是引用参数,引用参数不创建新的存储位置,引用参数的值总与基础变量相同

out修饰的参数是输出参数,与那个对函数成员调用中当作“自变量”的变量在同一个位置,
参数的值总与基础变量相同

两个还是有区别的,上面说的赋值是一部分
在有:
在函数成员内部,引用参数被做为初始已赋值,输出参数视为初始未赋值

(2)引用参数在函数调用前必须明确赋值,输出参数在函数返回前必须已明确赋值
tcdddd 2005-09-29
  • 打赏
  • 举报
回复
高手在来说几句嘛
tcdddd 2005-09-28
  • 打赏
  • 举报
回复
另外:楼上的楼上……,不知道是几楼的楼上说:
我自己的迷惑: 当参数是对象类型的时候,不使用ref和out声明,向方法内传递的实际上是对象的引用,同样在方法内部修改对象,这时候ref和out的作用我感到很困惑。
我的理解是:
如果在函数体内不对参数开辟新的内存(即重新实例化),那么用不用out或ref是一样的(string类除外,好像string类的操作更像值类型);如果在函数内部要对参数重新实例化,就需要用ref或out了,因为如果不用ref或out的时候,参数实际上传的是对象引用的一个拷贝(就像c语言里船只真参数实际上也是传的指针的拷贝一样),对原来对象的操作就能对对象进行修改,如果要new一个实例的话,只是这个拷贝指向这块内存,而原来的对象引用还是指向原来的内存空间。况且参数的生存期只在函数体内,出了函数对他分配的内存也应该被回收。
tcdddd 2005-09-28
  • 打赏
  • 举报
回复
这位是肉动物同志,能给介绍一下,用out就比用ref写出来的程序更可靠,更容易维护呢??
兄弟刚接触c#两三个月,只懂皮毛!
gj121 2005-09-28
  • 打赏
  • 举报
回复
一楼的正确明了!
sarcophile 2005-09-28
  • 打赏
  • 举报
回复
楼主说说为什么不用指针?“也只不过多了...,要注意...而已”放弃了指针,不是为了写程序方便,而是为了写出来的程序更安全、健壮。

ref 和 out 也是一样,不是为了你方便或麻烦,而是让你写出来的程序更可靠,更容易维护
tcdddd 2005-09-28
  • 打赏
  • 举报
回复
赫赫,楼上和我想的一样,“使参数用途更明确”这才是真正的目的,我的意思是微软没必要这样做。因为本来都是很简单的东西,却使得大家不得不花很多时间去弄懂他们之间细微的差别。反正我是查了不少资料的,到最后他们之间还是那么一点差别,所以我感觉被骗了,就来论坛里和大家讨论一下,发发牢骚,赫赫。本来我发过另外一篇帖子,好像语言有点过激,第二天就被删了,5~~~~~!所以这次改的缓和了一点,谢谢大家的观点。既然微软的牛人在c#中加入out,应该有更好的道理吧,但我们要抱着怀疑的态度看待问题,以不至于太教条,尽信书则不如无书嘛。这帖子暂时还不结,欢迎高手接续给出自己的想法。
wagada 2005-09-28
  • 打赏
  • 举报
回复
楼上的说的有道理。举个例子:
public class ClsTest
{
public int intX;

public ClsTest()
{
intX = 0;
}
}

static void Func( ClsTest argClsTest )
{
argClsTest = new ClsTest();
argClsTest.intX = 7456;
}

static void Main(string[] args)
{
ClsTest m_cls = new ClsTest();

Func( m_cls );

Console.WriteLine( m_cls.intX );
}
返回的结果是0;如果Func使用了ref关键字,那么结果就变成了7456。

至于“用out就比用ref写出来的程序更可靠”,这个说法不对吧,out和ref都是表示参数使用引用传递的关键字,它们配合使用使参数用途更明确:ref,掉用方法前必须被初始化;out,调用方法里必须被初始化。举例就不用了吧,你很聪明的。
加载更多回复(11)

110,556

社区成员

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

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

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