CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

out 和ref好难理解,能帮帮忙吗?

楼主sjhcsdn(sjhcsdn)2003-11-01 21:24:07 在 .NET技术 / C# 提问

如题,能说说您的理解吗?谢谢了 问题点数:0、回复次数:11Top

1 楼HNU(嶽麓書院,惟楚有材,於我為盛!)回复于 2003-11-01 21:36:06 得分 0

简单点  
   
  当你传   out    
   
  private   void   myMethod(out   int   a)  
  {  
          在方法里面必须给   a   赋值;如   a   =   34;  
  }  
   
   
  private   void   myMethod(ref   int   a)  
  {  
          在方法里面不一定给   a   赋值;  
          但是如果用了a   =   34;//a   的值将被改变  
  }  
   
  ////////////////////////////////  
   
  int   a   =100;  
  myMethod(ref   a);  
  此时a   =   34;  
   
   
   
   
   
  Top

2 楼Abac(~~)回复于 2003-11-02 01:06:52 得分 0

同意楼上,虽然都可以从方法里得到数值,但ref和out改变的方式不同。  
  ref直接操作参数的内存地址。输入参数则强制要在方法里面赋值。Top

3 楼rgbcn(奔向.net)回复于 2003-11-02 01:44:27 得分 0

方法参数    
         
        方法的参数是个值得特别注意的地方。方法的参数传递有四种类型:传值(by   value),传址(by   reference),输出参数(by   output),数组参数(by   array)。传值参数无需额外的修饰符,传址参数需要修饰符ref,输出参数需要修饰符out,数组参数需要修饰符params。传值参数在方法调用过程中如果改变了参数的值,那么传入方法的参数在方法调用完成以后并不因此而改变,而是保留原来传入时的值。传址参数恰恰相反,如果方法调用过程改变了参数的值,那么传入方法的参数在调用完成以后也随之改变。实际上从名称上我们可以清楚地看出两者的含义--传值参数传递的是调用参数的一份拷贝,而传址参数传递的是调用参数的内存地址,该参数在方法内外指向的是同一个存储位置。看下面的例子及其输出:    
         
      using   System;    
      class   Test    
      {    
          static   void   Swap(ref   int   x,   ref   int   y)    
          {    
              int   temp   =   x;    
              x   =   y;    
              y   =   temp;    
          }    
          static   void   Swap(int   x,int   y)    
          {    
              int   temp   =   x;    
              x   =   y;    
              y   =   temp;    
          }    
          static   void   Main()    
          {    
              int   i   =   1,   j   =   2;    
              Swap(ref   i,   ref   j);    
              Console.WriteLine("i   =   {0},   j   =   {1}",   i,   j);    
              Swap(i,j);    
              Console.WriteLine("i   =   {0},   j   =   {1}",   i,   j);    
          }    
      }    
         
        程序经编译后执行输出:    
         
      i   =   2,   j   =   1    
      i   =   2,   j   =   1    
         
        我们可以清楚地看到两个交换函数Swap()由于参数的差别--传值与传址,而得到不同的调用结果。注意传址参数的方法调用无论在声明时还是调用时都要加上ref修饰符。    
  Top

4 楼caff(caff)回复于 2003-11-02 02:18:09 得分 0

更重要的是在于使用的意义上  
  一般的,通过强制使用out声名参数可以清楚的表明这是个传出参数,  
  从而避免一些不必要的误解,而且也利于以后的维护Top

5 楼coudoufu(只爱细宝宝)回复于 2003-11-02 10:51:17 得分 0

一个是值,一个是引用。Top

6 楼dldl(做饭我一直用雕牌)回复于 2003-11-02 20:47:22 得分 0

2     OUT     参数      
   
   
  你是否想一次返回多个值?在C++语言中这项任务基本上是不可能完成的任务。在c#中"out"关键字可以帮助你轻松完成。这个关键字可以通过参数一次返回多个值。      
  public     class     mathClass      
  {      
  public     static     int     TestOut(out     int     iVal1,     out     int     iVal2)      
  {      
  iVal1     =     10;      
  iVal2     =     20;      
  return     0;      
  }      
   
  public     static     void     Main()      
  {      
  int     i,     j;     //     变量不需要初始化。      
  Console.WriteLine(TestOut(out     i,     out     j));      
  Console.WriteLine(i);      
  Console.WriteLine(j);      
  }      
  }      
   
  结果:      
   
  0     10     20      
   
   
   
      IN     参数      
   
  c#种的四种参数形式:      
  一般参数      
  in参数      
  out参数      
       
   
  在C语言你可以通传递地址(即实参)或是DELPHI语言中通过VAR指示符传递地址参数来进行数据排序等操作,在C#语言中,是如何做的呢?"in"关键字可以帮助你。这个关键字可以通过参数传递你想返回的值。      
  namespace     TestRefP      
  {      
  using     System;      
  public     class     myClass      
  {      
   
  public     static     void     RefTest(ref     int     iVal1     )      
  {      
  iVal1     +=     2;      
   
  }      
  public     static     void     Main()      
  {      
  int     i=3;     //变量需要初始化      
   
  RefTest(ref     i     );      
  Console.WriteLine(i);      
   
  }      
  }      
  }      
   
  必须注意的是变量要须先初始化。      
   
  结果:      
   
  5      
   
  Top

7 楼sjhcsdn(sjhcsdn)回复于 2003-11-04 14:58:58 得分 0

rgbcn(cody)你好看了,也就是说如果做下面改动的话就会这样输出是不是  
   
  static   void   Main()    
          {    
              int   i   =   1,   j   =   2;    
              Swap(ref   i,   ref   j);    
              Console.WriteLine("i   =   {0},   j   =   {1}",   i,   j);    
              Swap(ref   i,ref   j);    
              Console.WriteLine("i   =   {0},   j   =   {1}",   i,   j);    
          }    
   
  i   =   2,   j   =   1  
  i   =   1,   j   =   2  
  Top

8 楼vipfenghuang(张伟)回复于 2003-11-04 15:03:10 得分 0

 
  out   :   新增加的输出,空的  
   
  ref:   引用传入的参数,在原有的基础上加  
   
  分不同的情况用不同的Top

9 楼ffb(项目急,顾不了结构的)回复于 2003-11-04 15:22:34 得分 0

dldl(403)   :  
  C++也可以做到的,谁说做不到Top

10 楼sjhcsdn(sjhcsdn)回复于 2003-11-04 15:36:45 得分 0

那么交换的意义在那里呢Top

11 楼sjhcsdn(sjhcsdn)回复于 2003-11-04 15:55:31 得分 0

using   System;    
  class   Test    
  {    
           
          static   void   Swap(int   x,int   y)    
          {    
              int   temp   =   x;    
              x   =   y;    
              y   =   temp;    
      Console.WriteLine("x   =   {0},y   =   {1}",x,y);  
                     
          }    
          static   void   Main()    
          {    
              int   i   =   1,   j   =   2;    
                
              Swap(   i,   j);    
              Console.WriteLine("i   =   {0},   j   =   {1}",   i,   j);    
                     
          }    
  }    
   
  输出结果为:  
        i   =   2,   j   =   1  
        i   =   1,   j   =   2  
  这说明了交换函数的意义虽然不能改变原来变量中的存储值但可以将以这两个变量的考贝的形式的值交换,  
   
  这个结论对不对?Top

相关问题

  • winamp这个程序好难理解啊
  • 为什么C++类和以后的知识都很难理解?
  • 100分求学“流”!流好难理解啊。谁能来讲解讲解吗?
  • 【转贴】男人赚钱真的好难(理解一下男同志吧)
  • 汉诺塔的递归算法很好理解,为什么这个非递归就这么难理解?
  • 我看别人写的htc的代码 有一句好难理解,请各位帮忙,看看什么意思
  • 很难理解的错误提示
  • 一个很难理解的问题?
  • 链表类为什么那么难理解?
  • 关于TPersistentClass使用时遇到的难理解的问题?

关键词

  • c#
  • 交换
  • 语言
  • 参数
  • 调用
  • 修饰符
  • ref
  • 值
  • 输出
  • 方法

得分解答快速导航

  • 帖主:sjhcsdn

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo