A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 朱磊 于 2012-1-2 12:11 编辑

{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
陈涛 + 1

查看全部评分

2 个回复

倒序浏览
要谈这两个关键字,先从方法参数说起:

1.在C#中,默认的,所有参数都是值传递:

这里面就涉及到调用方法时传递的是值类型还是引用类型(这两种类型的区别就不多说了-我发一个我用内存分配突来理解的附件给你(参数传递内存分配问题)),
然后当中很重要的一点就是传递的参数是原始类型,那么被调方法中的改变只是在副本上进行,不会影响原来的整数;然后呢C#为了允许对传递的原始类型的修改i对象原来的对象也有用,就引入了Ref和Out关键字;

2.两者都是导致参数通过引用传递(类似C中的指针变量),而且 方法定义和调用方法都必须显示Ref和Out关键字:

c# CODE(Ref关键字):
  1. class Class1
  2.     {
  3.       
  4.         
  5.         public static void Method(ref int i)
  6.         {
  7.             i = 44;
  8.         }


  9.     }

  10. static void Main()
  11.         {
  12.             int value = 0;//传递前需要初始化
  13.             Class1.Method(ref value);

  14.            // val 值现在是44
  15.           Console.WriteLine("{0}", value);
  16.           Console.ReadKey();



  17.         }
复制代码
C# CODE(Out):
  1. class Class1
  2.     {
  3.         public static void Method(out int i, out string s1, out string s2)
  4.         {
  5.             i = 44;
  6.             s1 = "I've been returned";
  7.             s2 = null;

  8.         }
  9. }
  10.   static void Main(string[] args)
  11.         {

  12.             int value;
  13.             string str1, str2;//传递前不需要初始化;
  14.             Class1.Method(out value, out str1, out str2);
  15.            
  16.             // value 值现在是 44
  17.             // str1 值现在是"I've been returned"
  18.             // str2 仍然为null;
  19.             Console.WriteLine("{0}\n{1}\n {2}", value,str1 ,str2 );



  20.             Console.ReadKey();
  21.         }
复制代码
注意:如果一个方法采用ref关键字,而另一个方法采用out关键字,则无法重载(方法重载:使用带有不同参数列表的同样的方法名用于多个方法)这两个方法;因为他们在运行时处理方式虽不同,但是编译处理方式相同!

参数传递内存分配问题.rar

37.72 KB, 下载次数: 170

评分

参与人数 1技术分 +2 收起 理由
陈涛 + 2

查看全部评分

回复 使用道具 举报
傅涌钦 发表于 2012-1-2 10:45
要谈这两个关键字,先从方法参数说起:

1.在C#中,默认的,所有参数都是值传递:

OK 了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马