C#中的 ref 传进出的到底是什么 解惑篇

简介:

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

另附言:

本文写于早上,就在想发布的那瞬间,靠,公司断网了,原来修改的部分丢失了。
网一断就是一天了,现在回到家才把之发布。

 

 

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

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

原来以前明白的,被忽悠一下变不明白了,还以为自己原来的代码写错了。

 

今天在帮人家解惑时,才把自己的惑给解了。

这里我把上篇文章原问题的代码小修改了一下

贴出来做示例:

复制代码
ExpandedBlockStart.gif
   ///   <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 。

 


相关文章
|
7月前
|
机器学习/深度学习 算法 安全
URL过滤算法:上网行为管理软件中的重要利器
URL过滤算法在上网行为管理软件中可谓是大显身手的&quot;网络管家&quot;,它的作用绝对不容小觑。就好像是一个智能导航员,可以帮助我们精准掌控网络大海中的航向,保障我们的上网安全和舒适。接下来就让我们一起来看看,这位&quot;网络管家&quot;都有哪些神奇的功能吧!
114 0
|
1月前
|
网络协议 安全 Linux
网络扫描神器:Nmap 保姆级教程(附链接)
网络扫描神器:Nmap 保姆级教程(附链接)
537 0
|
8月前
|
关系型数据库 MySQL Linux
|
8月前
|
监控 Linux Shell
|
8月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-网上地图资源获取1
前端学习笔记202305学习笔记第二十三天-网上地图资源获取1
29 0
|
8月前
|
前端开发 定位技术
前端学习笔记202305学习笔记第二十三天-网上地图资源获取2
前端学习笔记202305学习笔记第二十三天-网上地图资源获取2
38 0
|
前端开发
前端工作总结199-对ref的理解
前端工作总结199-对ref的理解
55 0
前端工作总结199-对ref的理解
|
存储 JavaScript 前端开发
冇事来学系--Vue2.0中ref引用
jQuery相比于原生JS,牛逼在简化了操作DOM的过程 vue的优势:MVVM框架,在vue中,不需要操作DOM,程序员只需要把数据维护好即可(数据驱动视图) 假设:在vue中需要操作DOM,需要获取到页面上某个DOM元素的引用,该如何?---> 使用ref引用
149 0
|
网络架构
冇事来学系--Vue2.0中动态路由分配
动态路由指的是:把Hash地址中可变的部分定义为参数项,从而提高路由规则的复用性
146 0
|
Web App开发 存储 前端开发
面试装X:我知道的前端跨页面通信
本篇文章就是对前端跨页面通信的解决方案做了一个了解。
353 0