博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#中的 ref 传进出的到底是什么 解惑篇
阅读量:5945 次
发布时间:2019-06-19

本文共 1504 字,大约阅读时间需要 5 分钟。

今天在浏览博文时,看到这篇文章:

另附言:

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

 

 

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

最近有人在看我  的时候说起,既然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 。

 

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2010/09/04/1817822.html

你可能感兴趣的文章
自带科技基因,打造纯原创IP,“燃烧小宇宙”获数千万A轮融资
查看>>
未能加载文件或程序集&quot;Newtonsoft.Json, Version=4.5.0.0
查看>>
C#多线程编程系列(二)- 线程基础
查看>>
Jenkins 内置变量(学习笔记二十四)
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 13 章 并发控制_13.2. 事务隔离
查看>>
虚拟机概念
查看>>
【云周刊】第195期:全球首家!阿里云获GNTC2018 网络创新大奖 成唯一获奖云服务商...
查看>>
【VS】使用vs2017自带的诊断工具(Diagnostic Tools)诊断程序的内存问题
查看>>
AutoScaling 支持从实例启动模板创建实例
查看>>
Mysql 查看视图、存储过程、函数、触发器
查看>>
Java提高篇(二):IO字节流、字符流和处理流
查看>>
云HBase集群的规划
查看>>
hello dato--graphlab create
查看>>
一个优质男朋友的标准
查看>>
浩鲸科技和京东加入 OpenMessaging 开源标准社区
查看>>
spring 注入方式
查看>>
FileZilla Client 3.42.0 beta1 发布,流行的 FTP 解决方案
查看>>
深度学习之迁移学习介绍与使用
查看>>
Qt学习笔记(一)-文件目录与术语解释
查看>>
IDEA 自动导入包
查看>>