d的值发生改变,为什么

zhengyingcan 2009-02-13 12:43:00
namespace ConsoleApplication16
{
class Program
{
static void Main(string[] args)
{
int[] a = { 3, 4 };
int c = a.Length;
int[] b = { 0, 1, 2 };
int[] d = b;
a.CopyTo(b, 0);
Console.WriteLine(d[0]);
Console.ReadKey();
}
}
}
请看以上代码,d之前的值是{ 3, 4, 2 }
同时d的值自动发生了改变,也变成了{ 3, 4, 2 }
后来 b的值自动发生了改变,变成了{ 3, 4, 2 }, 这是为什么呢,
...全文
83 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhengyingcan 2009-02-15
  • 打赏
  • 举报
回复
谢谢,明白了
kkun_3yue3 2009-02-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 perisonchen 的回复:]
引用类型与值类型

另外:
d之前的值是{ 3, 4, 2 }
同时d的值自动发生了改变,也变成了{ 3, 4, 2 }

不明白什么意思...
[/Quote]

你先简单理解成别名吧,就像先前说的老李,李云龙,李团长,独立团长都是同一个人的不同称谓而已,
如果老李病了,那么李云龙也病了,李团长也病了,独立团长也病了,
呵呵,实际上"病"的是同一个人
kkun_3yue3 2009-02-14
  • 打赏
  • 举报
回复
我再组织组织下

1,关键是看它是否调用了构造函数,
因为构造函数直接决定了是否分配新的内存空间,
空间的分配与否决定了是否指向同一内存地址

调用构造函数再使用等号则会产生新的内存地址,此时为赋"值"
引用类型的情况下,不调用构造函数直接使用等号则为引用,此时会产生"一改全改"的效果,简单理解为"别名",如李云龙,老李,李团长,指的是同一个人
perisonchen 2009-02-14
  • 打赏
  • 举报
回复
引用类型与值类型

另外:
d之前的值是{ 3, 4, 2 }
同时d的值自动发生了改变,也变成了{ 3, 4, 2 }

不明白什么意思...
kkun_3yue3 2009-02-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhengyingcan 的回复:]
等号的意思就是引用啊,原来如此,    可是很多时候等号不是引用,是赋值,有点晕,不知道等号什么时候是引用,什么时候是赋值.
[/Quote]

还是没理解正确
赋值,引用是两个不冲突的概念,还真不好组织语言一下子把说清楚,
我多说些,看能不能说明白

赋值,等号右边的值赋给左边的变量
如果该变量是值类型的,那么就是赋"值",
如果该变量是引用类型的,也叫赋值,但新变量和源变量都指向同一内存地址,使用引用或源变量都可以修改其值,你举的例子演示了这一点
如果先调用new构造函数,再使用等号赋值,则不会发生这样的问题,因为新变量和源变量指向不同的内存地址,此时是非引用,而是赋"值",
关键就在那个构造函数上,它直接关系到是否分配新内存空间,不分配的情况下就是引用,分配的情况下就是新对象
如果楼主有C/C++基础的话,应该不难理解,不过不要同C/C++里的引用和指针再混淆起来,所以这个比喻不是很好,只希望能正确理解它就好

这里有一篇文章很详细的解释了值类型和引用类型的区别,推荐你看下
http://www.cnblogs.com/anytao/archive/2007/05/23/must_net_08.html
king19840811 2009-02-13
  • 打赏
  • 举报
回复
b,d搞晕了。。
Fibona 2009-02-13
  • 打赏
  • 举报
回复
因为b是d的引用,指向是的同一内地址
zhengyingcan 2009-02-13
  • 打赏
  • 举报
回复
等号的意思就是引用啊,原来如此, 可是很多时候等号不是引用,是赋值,有点晕,不知道等号什么时候是引用,什么时候是赋值.
kkun_3yue3 2009-02-13
  • 打赏
  • 举报
回复
引用啊,一楼正解

110,536

社区成员

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

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

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