今天在浏览博文时,看到这篇文章:C#中的ref 传进出的到底是什么 ? 在传对象时使用ref的疑问

引用类型就传的就是地址,值类型传的就是值,可是还仍有那么多人迷惑,网上虽然流传着很多ref 的相关文章,似乎都没为大伙解下惑。

最近有人在看我 CYQ.Data 框架 的时候说起,既然class是引用地址,本身传的就是地址,你代码中还要写ref传递来干什么;

贴出来做示例:


  /// <summary>
    /// by 路过秋天 http://cyq1162.cnblogs.com
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
           Person p = new Person("张三");
           Change(p);
           Write(p.Name); //输出的是张三 并不是李四            Change(p, "李四");  
           Write(p.Name);//输出的是李四           Change(ref p);
          Write(p.Name); //输出的是王五 
          Console.ReadKey();
    }   
        static void Change(Person p)
        {
           p = new Person("李四");
        }
        static void Change(Person p, string name)
        {
            p.Name = name;
        }
        static void Change(ref Person p)
        {
            p = new Person("王五");
        }
    }

这里顺便截图让大伙看看是怎么调试而解惑的。

F5运行:

1:我们运行到第一行代码,断点:

重点说明:p地址:0x044becf8

2:我们运行到Change(p)内部中

重点说明:p地址发生变化:0x044becd0
简单说:你这内部的p和外面的p都不一样,所以不会影响外面p的地址。
备注p值的地址变化了,是因为断点在第一行代码时还没执行实例化,所以其值是一样的。

于是第一行结果输出:张三

3:接下来运行到Change(p,"李四") 函数内部

重点说明:这里内部的p的地址还是发生了变化,变成了0x044becd0
然而其指向的值是一样的,所以你把值改了,所以“李四”就出来了。
备注:内部的p和外面的p虽然不一样,但是指向的值是一样的。

于是第一行结果输出:李四

4:最后是 Change(ref p) 函数内部

重点说明:这里内部的p地址和外部的p地址是一样的,没有发生变化。
然后重新指向一个新的对象,只是对象的值地址发生了变化。
备注:外部p地址=内部p地址,所以其指向的值都是新的对象的值。

于是第三行结果输出:张三

最终结果图如下:

最后结言:

对于Class类型使用 ref,是为了保持引用的地址是一致的。
所以,不要仅仅意识到引用类型传地址,值类型传值就了事了,要切切的注意到,引用类型传址时,内部传参会产生一个新地址。
所以我们在传递类引用时,喜欢在内部使用 new的民工们得注意注意了。
这里似乎也是传参领域的问题,只是附上了 ref 。
 

最新文章

  1. 浏览器兼容处理(HTML条件注释、CSSHack和JS识别)
  2. SSL协议运行机制
  3. 一些qml资料
  4. MongoDB数据访问[C#]附源码下载(查询增删改) 转载
  5. ****Web API 版本控制的几种方式
  6. crontab的安装及crontab命令介绍
  7. LeeCode-Insertion Sort List
  8. 5款新颖的ReSharper插件
  9. 手机自动化测试:Appium源码之API(2)
  10. syncer.go
  11. Asp.Net SignalR 集群会遇到的问题
  12. kali linux 安装 matlab2016Rb
  13. flash推流工具&lt;转&gt;
  14. 【转载】SQL Server 版本列表
  15. JTree常用方法
  16. Windows系统下做定时任务为Oracle数据库每天自动备份
  17. javascript飞机大战-----006创建敌机
  18. 图说使用socket建立TCP连接
  19. Java 判断某一天是这一年的第几天
  20. [Erlang07] Erlang 做图形化编程的尝试:纯Erlang做2048游戏

热门文章

  1. bzoj1015题解
  2. NX二次开发-创建圆弧(圆心-半径)UF_CURVE_create_arc
  3. NX二次开发-测量投影距离
  4. C++之引用与符号“&amp;”
  5. c# 将byte数组保存成图片
  6. window location跳转
  7. Day 9 :初识函数
  8. scala实现读取Oracle数据
  9. js 事件驱动原理
  10. python学习5—一些关于基本数据结构的练习题