C#中b=a的多种情况及结果分析

这篇文章主要介绍“C#中b=a的多种情况及结果分析”,在日常操作中,相信很多人在C#中b=a的多种情况及结果分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#中b=a的多种情况及结果分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

成都创新互联公司-云计算及IDC服务提供商,涵盖公有云、IDC机房租用、四川主机托管、等保安全、私有云建设等企业级互联网基础服务,咨询电话:18982081108

两个相同类型的变量a和b,并且有如下关系:

b=a;

如果a发生改变,b是否也发生改变呢?

情况很复杂,分以下几种情况谈论:

1) 单个实体

1. 简单类型

先考察int:

inta=1; intb=a; a=2; Console.WriteLine("b:"+b);

输出结果:

C#中b=a的多种情况及结果分析

再考察一下string:

stringa="1"; stringb=a; a="2"; Console.WriteLine("b:"+b);

输出结果:

C#中b=a的多种情况及结果分析

如果不放心,还可以测试一下Enum,结果类似,详见Demo。

结论:简单类型是组成复合类型的最基本单位,是原子,不可再拆分,所以不管是值类型double、int还是引用类型string,b都不随a的改变而改变,因为它们指向全局堆栈(对于string而言是托管堆)上的同一个地址。

2. 复合类型

复合类型是由string、int、double这些简单类型组成的。

分别定义一个复合的引用类型(class)和一个复合的值类型(struct)。

classUserInfo { publicstringUserName; publicintAge; } structUserInfo2 { publicstringUserName; publicintAge; }

先讨论引用类型:

UserInfoa=newUserInfo(){UserName="Baobao",Age=27}; UserInfob=a; a.UserName="AndersLiu"; a.Age=30; Console.WriteLine("b.UserName:"+b.UserName); Console.WriteLine("b.Age:"+b.Age);

输出结果:

C#中b=a的多种情况及结果分析

结论:b和a仍然指向托管堆上的同一个UserInfo实例的地址。而UserInfo实例的成员又包含着UserName和Age分别在托管堆和全局堆栈上的地址。所以修改a的成员UserName和Age,只是改变这两个成员的地址,而没有改变UserInfo实例的地址,所以b的成员UserName和Age也会跟着改变。

让我们局部修改上面的代码:

UserInfoa=newUserInfo(){UserName="Baobao",Age=27}; UserInfob=a; //a.UserName="AndersLiu"; //a.Age=30; a=newUserInfo(){UserName="AndersLiu",Age=30}; Console.WriteLine("b.UserName:"+b.UserName); Console.WriteLine("b.Age:"+b.Age);

输出结果:

C#中b=a的多种情况及结果分析

结论:对a重新进行实例化,导致a指向一个新的UserInfo实例的地址。而b仍然指向原先那个UserInfo实例的地址,所以b不会随着a的改变而改变。从此b和a是两个没有任何关系的变量。

再来看一下值类型:

UserInfo2a=newUserInfo2(){UserName="Baobao",Age=27}; UserInfo2b=a; a.UserName="AndersLiu"; a.Age=30; Console.WriteLine("b.UserName:"+b.UserName); Console.WriteLine("b.Age:"+b.Age);

输出结果:

C#中b=a的多种情况及结果分析

结论:问题集中在b=a这句话上。这时b指向的是a的一份copy,指向全局堆栈上的与a不同的地址。所以b和a是没有任何关系的,b不随a的改变而改变。


2) 集合

1.集合中一笔数据的增删修改。

Lista=newList(); Listb=a; a.Add(newUserInfo(){UserName="Baobao",Age=27}); Console.WriteLine("b.Countafteradding:"+b.Count); Console.WriteLine(); Console.WriteLine("Aftermodifyinga[0]"); a[0].UserName="AndersLiu"; a[0].Age=30; Console.WriteLine("b[0].UserName:"+b[0].UserName); Console.WriteLine("b[0].Age:"+b[0].Age); Console.WriteLine(); a.Remove(a[0]); Console.WriteLine("b.Countafterdeleting:"+b.Count);

输出结果:

C#中b=a的多种情况及结果分析

结论:b随着a中数据增减修改而变化。因为b和a指向托管堆上同一个List实例的内存地址,这和复合类型是一样的。

数组就不说了,可以看作是多个变量的集合,所以按照集合来处理。

到此,关于“C#中b=a的多种情况及结果分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


文章题目:C#中b=a的多种情况及结果分析
文章位置:http://scyanting.com/article/iheioo.html