关于引用传递的疑惑

大侃而谈 2012-12-22 12:00:14

class Program
{
private static void Main(string[] args)
{
var obj = new RefObject();
obj.Flag = "csharp";
var newobj = obj;
obj = null;
Console.WriteLine(newobj.Flag);
Console.ReadLine();
}
}

public class RefObject
{
public string Flag { get; set; }
}


代码如上,当“obj = null”后,为什么newobj依然可以使用,我以前一直认为引用传递会导致这样的引用链全部为null了。
...全文
184 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
var newobj = obj; 这就是普通的赋值,你不要想太多了。 所谓“引用传递”,你怎么纠缠到赋值语句上了?谁跟你说过赋值语句是“引用传递”的?
大侃而谈 2012-12-22
  • 打赏
  • 举报
回复
引用 1 楼 mt_chenwenhui 的回复:
这个是引用传递么?我怎么觉得是值传递?
我一直认为是引用传递,也可能是我的概念错了。 所以有可能的话,也请详解一下。
华生天下行走 2012-12-22
  • 打赏
  • 举报
回复
这个是引用传递么?我怎么觉得是值传递?
cs张 2012-12-22
  • 打赏
  • 举报
回复
引用 7 楼 simpkan 的回复:
引用 5 楼 xiaxia017 的回复: null给引用对象赋值,引用对象将从指向原地址改为指向空地址,这对原地址内的数据没有任何影响啊。 这个解释非常有意思。似乎解答了问题。 我感觉是“=null”的原理的问题。即null是什么的问题。
清空对象的数据,但该对象还是存在~
  • 打赏
  • 举报
回复
在c#中所有的赋,真的是赋。。。 var newobj = obj; 这句话真正该理解成 将obj的栈中的数据拷贝一份到newobj中。 对于引用类型所赋的值实际上是栈中保存的一个内存地址 对于值类型所赋的值,是栈中保存的实际值
  • 打赏
  • 举报
回复
我来解释下 var obj = new RefObject();执行后 栈 堆 obj引用的内存地址 obj中保存的对象 执行var newobj = obj;后的堆栈是这样 栈 堆 obj引用的内存地址 obj中保存的对象 newobj中保存同obj相同的地址 执行 obj = null; 后 栈 堆 obj不引用任何内存地址,即切断了关系 obj中保存的对象 newobj中依然还是原来的内存地址 正是因为newobj依然保存有对堆内存的引用,所以可以访问堆中的obj对象
小疯疯008 2012-12-22
  • 打赏
  • 举报
回复

public void Change(object obj)
{
     obj = null;
}
private static void Main(string[] args)
        {
            var obj = new RefObject();
            obj.Flag = "csharp";
            Change(obj);  //这是引用传递
            Console.WriteLine(obj.Flag);
            Console.ReadLine();
        }
你把你的
大侃而谈 2012-12-22
  • 打赏
  • 举报
回复
引用 6 楼 softkexin 的回复:
这个是值传递...
为什么呢?难道赋值就是值传递,其码不能这样解释吧。 我认为赋的是对象,是class,那么一定目标得到的是内存地址的引用,但我的知识里,这种传递就叫做引用传递。 疑惑呀。 5楼的兄弟解释的不知道是否权威。
大侃而谈 2012-12-22
  • 打赏
  • 举报
回复
引用 5 楼 xiaxia017 的回复:
null给引用对象赋值,引用对象将从指向原地址改为指向空地址,这对原地址内的数据没有任何影响啊。
这个解释非常有意思。似乎解答了问题。 我感觉是“=null”的原理的问题。即null是什么的问题。
IT-Style 2012-12-22
  • 打赏
  • 举报
回复
这个是值传递...
xiaxia017 2012-12-22
  • 打赏
  • 举报
回复
null给引用对象赋值,引用对象将从指向原地址改为指向空地址,这对原地址内的数据没有任何影响啊。
大侃而谈 2012-12-22
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
var newobj = obj; 这就是普通的赋值,你不要想太多了。 所谓“引用传递”,你怎么纠缠到赋值语句上了?谁跟你说过赋值语句是“引用传递”的?
赋值,从原理上是什么呢?难道不是将值的对象在内存中的地址传递给目标对象么? 那么值传递和引用传递又会是什么呢? 我承认,可能我的概念有不清楚,望能详解。谢谢。

110,534

社区成员

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

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

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