引用类型问题,求大神解惑!

zhaixd123 2017-03-26 12:48:57

static void Main(string[] args)
{
Test123[] ts=new Test123[10];
Test123 t = new Test123();
t.i = 100;
ts[0] = t;

Test123 t2 = new Test123();
t2 = ts[0];

t2.i = 99;
t2 = null;
Console.WriteLine(ts[0].i.ToString());

}
为什么这段代码执行后的结果会是99呢,从始至终我都没有把t2 赋给过 ts[0]啊,
我只是把 ts[0] 赋给了t2, 那么是不是说t2的内存地址已经指向了 ts[0] ,然后改变t2的值也就等于改变了 ts[0]
那么就算是这样,为什么后面t2=null;的时候 ts[0]没有跟着null呢,不是指向了同一个内存地址么?
...全文
213 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
            t2 = ts[0];//这段代码t2指向了

            t2.i = 99;//这里已经和ts[0]是一个对象了
            t2 = null;//重新指向,这里表示不指向任何对象,这时t2和ts[0]没关系了
正怒月神 2017-03-27
  • 打赏
  • 举报
回复
john_QQ:2335298917 2017-03-27
  • 打赏
  • 举报
回复
t2和ts[0]是指向了同一个内存地址,但是改变t2的指向并不改变ts[0]的指向啊
江南小鱼 2017-03-27
  • 打赏
  • 举报
回复
t2 = null; 是给t2一个空指针
  • 打赏
  • 举报
回复
.net 对于引用类型变量赋值是 copy 引用的。那么执行代码 t2 = null; 时,虽然改变了 t2 的引用,并不会改变 ts[0] 的引用,它此时就不是 null。
  • 打赏
  • 举报
回复
t2.i = 99; 这里,你给一个值类型的 i 字段/属性赋值,这会 copy 一遍 99 这个对象。 t2 = ts[0]; 这里,你给一个引用类型的 t2 变量赋值。这只会 copy 一遍 ts[0] 引用,并不会 copy ts[0] 所引用的对象。
xuzuning 2017-03-27
  • 打赏
  • 举报
回复
其实这是对 C# 的无解而造成的 C# 实际只编译成中间语言 IL,由 JIT 虚拟机执行 并不直接操作内存,因此若按 C/C++ 对变量的存储进行解释,必然就出现楼主的疑惑
Poopaye 2017-03-27
  • 打赏
  • 举报
回复
画了张图
wzp646011267 2017-03-27
  • 打赏
  • 举报
回复
你的=就是指向同一个内存地址
xuggzu 2017-03-26
  • 打赏
  • 举报
回复
t2只是指向了ts0,所以改了t2.i,ts0会变。
t2=null,是指把t2指向清除,不是清除那个地址的内容。
t2,ts都是变量,本身有地址,保存的是声明类型实例的首地址,t2.i,ts0.i的赋值操作是改变实例成员的值,而t2或ts0自己的赋值操作改变的是保存的首地址值,而不是实例的值。
cpycpy000 2017-03-26
  • 打赏
  • 举报
回复
唔,首先,引用数据类型的传递是 伪地址传递,只有加上ref关键字才是真正的地址传递 其次,传递是什么意思呢?传递其实就是复制一份过去,所以值传递和地址传递的区别就在于一个复制了值,一个复制的是地址 所以,你把t2置为 null的时候,只是把复制给t2的那个地址清除掉了,而ts[0]本身的地址其实还是存在的。 由此可以推出: 如果要把引用数据类型当作参数传递给一个函数的时候,在那个函数里面不能对这个引用数据类型进行初始化。因为一旦初始化之后就会丢失你传入的地址。如果一定要初始化的话,就加上ref关键字。

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧