今天在浏览博文时,看到这篇文章: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 。
 

C# 中的三个高级参数 ref的更多相关文章

  1. 浅谈c#的三个高级参数ref out 和Params C#中is与as的区别分析 “登陆”与“登录”有何区别 经典SQL语句大全(绝对的经典)

    浅谈c#的三个高级参数ref out 和Params   c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和 ...

  2. 浅谈c#的三个高级参数ref out 和Params

    c#的三个高级参数ref out 和Params 前言:在我们学习c#基础的时候,我们会学习到c#的三个高级的参数,分别是out .ref 和Params,在这里我们来分别的讲解一下,在这里的我们先不 ...

  3. C# 中的三个高级参数 params

    params params 关键字可以指定采用数目可变的参数的方法参数. 可以发送参数声明中所指定类型的逗号分隔的参数列表或指定类型的参数数组. 还可以不发送参数. 在方法声明中的 params 关键 ...

  4. C#高级参数ref的使用

    ref关键字用于将方法内的变量改变后带出方法外.具体我们通过例子来说明: 例子中,将变量n1和n2交换了.如果没有加ref参数,由于没有swadDemo()方法没有返回值,调用后,n1和n2是不会交换 ...

  5. Struts中Action三种接收参数的方式?

    前言: 前面已经有一篇随笔介绍了Struts2的大概原理.本文就Struts2中Action与jsp页面进行数据对接时介绍几种常见方法! 值栈ValueStack 3个Action Action1 p ...

  6. C#高级参数out的使用

    C#中有三个高级参数,分别是out,ref,params.本文章中先来介绍out参数的使用. out,用于在方法中返回多余值.(可以理解为让一个方法返回不同的类型值) 我们通过例子来理解例子的功能:用 ...

  7. C#方法中参数ref和out的解析

    一.C#方法中参数类型 有4种参数类型,有时候很难记住它们的不同特征,下图对它们做一个总结,使之更容易比较和对照. 二.C#方法中的参数 1.值参数 使用值参数,通过复制实参的值到形参的方式把数据传递 ...

  8. C#高级参数out,ref,params

    在C#中通过使用方法来获取返回值时,通常只能得到一个返回值.因此,当一个方法需要返回多个值的时候,就需要用到ref和out,那么这两个方法区别在哪儿呢? out 当需要返回一系列返回值时可用out高级 ...

  9. C#中的out参数/ref参数/params可变参数

    out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...

随机推荐

  1. git学习记录1(本地库管理)

    学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...

  2. 10.2 External interrupt/event controller (EXTI)

    EXTI控制器的主要特点如下: 每个中断/事件线上的独立触发器和掩码 每个中断行的专用状态位 生成最多20个软件事件/中断请求 脉冲宽度小于APB2时钟周期的外部信号检测. 每条中断线路的专用状态位生 ...

  3. VMware Workstation 添加磁盘 挂载目录(centos)

    参考文档: Linux命令大全 需求:测试环境虚拟机某个目录下空间不足,准备通过添加一块磁盘,并将该目录挂载到该磁盘 前面几步在测试服务器上操作的,截图困难,所以网上找了几张设置图 关闭虚拟机(没测试 ...

  4. 剑指offer——26反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头.   题解: 每次只反转一个节点,先记住cur->next, 然后pre->cur,即可;   class Solution { pu ...

  5. Vue的项目搭建及请求生命周期

    目录 Vue的项目搭建及请求生命周期 Vue-CLI的项目搭建 环境搭建 项目创建 pycharm运行Vue项目 Vue项目的大体结构 Vue的请求生命周期 两个小用法 Vue的项目搭建及请求生命周期 ...

  6. Python+Django+ansible playbook自动化运维项目实战✍✍✍

    Python+Django+ansible playbook自动化运维项目实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受 ...

  7. Jmeter----参数化之csv文件

    用户编码:一般不用填写,如果有中文的时候,需要填写,填写utf-8就可以 变量名词:是指的把数据保存在什么变量里面,其他的默认就好了 Http请求和用户参数设置的一样

  8. Nginx常用功能配置一

    Nginx常用功能配置 参数include配置 说明:如果日常工作中server标签存在太多,可以采用include配置模式,Nginx的主配置文件包含的所有虚拟主机的子配置文件会统一放入extra目 ...

  9. List<VO>转成List<Map>

    List<A01090021BatchAddCheckVO> list = (ArrayList<A01090021BatchAddCheckVO>) result.get(& ...

  10. 03->OpenGL多边形,glut实现三角形条带和三角形扇

    图形学中基本图元是多边形,一般要求是凸多边形,三角形是最简单的凸多边形,在图形渲染中比一般多边形其绘制速度快.今天学习OpenGL绘制三角形条带和三角形扇基础.编程环境! 1. 三角形条带 指定顶点序 ...