C#中的 ref 传进出的到底是什么 解惑篇
来源:互联网 发布:销售业绩数据分析 编辑:程序博客网 时间:2024/06/06 07:30
本文内容为转载,原文链接:http://www.cnblogs.com/cyq1162/archive/2010/09/04/1817822.html
一直我们都知道,引用类型就传的就是地址,值类型传的就是值,可是还仍有那么多人迷惑,网上虽然流传着很多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("王五");
}
}
/// 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值的地址变化了,是因为断点在第一行代码时还没执行实例化,所以其值是一样的。
备注p值的地址变化了,是因为断点在第一行代码时还没执行实例化,所以其值是一样的。
于是第一行结果输出:张三
3:接下来运行到Change(p,"李四") 函数内部
重点说明:这里内部的p的地址还是发生了变化,变成了0x044becd0
然而其指向的值是一样的,所以你把值改了,所以“李四”就出来了。
备注:内部的p和外面的p虽然不一样,但是指向的值是一样的。
然而其指向的值是一样的,所以你把值改了,所以“李四”就出来了。
备注:内部的p和外面的p虽然不一样,但是指向的值是一样的。
于是第一行结果输出:李四
4:最后是 Change(ref p) 函数内部
重点说明:这里内部的p地址和外部的p地址是一样的,没有发生变化。
然后重新指向一个新的对象,只是对象的值地址发生了变化。
备注:外部p地址=内部p地址,所以其指向的值都是新的对象的值。
然后重新指向一个新的对象,只是对象的值地址发生了变化。
备注:外部p地址=内部p地址,所以其指向的值都是新的对象的值。
于是第三行结果输出:张三
最终结果图如下:
最后结言:
对于Class类型使用 ref,是为了保持引用的地址是一致的。
所以,不要仅仅意识到引用类型传地址,值类型传值就了事了,要切切的注意到,引用类型传址时,内部传参会产生一个新地址。
所以我们在传递类引用时,喜欢在内部使用 new的民工们得注意注意了。
所以,不要仅仅意识到引用类型传地址,值类型传值就了事了,要切切的注意到,引用类型传址时,内部传参会产生一个新地址。
所以我们在传递类引用时,喜欢在内部使用 new的民工们得注意注意了。
这里似乎也是传参领域的问题,只是附上了 ref 。
版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。我的微博:
创业项目《IT连》App,扫码下载:
Donation(扫码支持作者):支付宝和微信:
创业项目《IT连》App,扫码下载:
Donation(扫码支持作者):支付宝和微信:
阅读全文
0 0
- C#中的 ref 传进出的到底是什么 解惑篇
- C#中的 ref 传进出的到底是什么 解惑篇
- C#中的 ref 传进出的到底是什么 解惑篇
- 【cocos2dx】Ref 到底是什么鬼?
- c#委托到底是什么
- JavaScript中的this到底指的是什么!
- C# 中的ref & out关键字 的区别
- 关于C#中的ref的使用
- c#中的ref out
- C# 中的 ref 关键字
- C#中F5和ctrl+F5的区别到底是什么?
- php中的class到底是什么?
- EXTJS中的JSON到底是什么?
- java 中的哈希码到底是什么?
- JavaScript中的this到底是什么?
- Windows中的消息到底是什么??
- Java中的null到底是什么?
- Java中的null到底是什么?
- 集合中 hashcode 与 equals 的关系
- smartbi学习记四之几个简单的设置
- Sqlserver常用函数例子说明
- Toolbar的简单使用
- log4j 初始化 initialize the log4j system properly
- C#中的 ref 传进出的到底是什么 解惑篇
- POJ1004
- jamvm的浅显认识
- 笔记1
- Android Studio调用百度地图
- python核心编程第12章习题
- Java实现简单的RPC框架
- fastJson过滤字段(深层次)
- 一些方便的LaTex在线编辑工具