在这里我们将介绍#中b=a的多种情况及结果,希望通过本文仔细做好两个变量中,一个改变而另一个的状态,希望对大家有所帮助。
站在用户的角度思考问题,与客户深入沟通,找到密山网站设计与密山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、做网站、企业官网、英文网站、手机端网站、网站推广、申请域名、网站空间、企业邮箱。业务覆盖密山地区。
本文旨在验证一个容易混淆的概念,从而为《玩转WPF/Silverlight中INotifyPropertyChanged和ObservableCollection》做铺垫。
两个相同类型的变量a和b,并且有如下关系:
b=a;
如果a发生改变,b是否也发生改变呢?
情况很复杂,分以下几种情况谈论:
1) 单个实体
1. 简单类型
先考察int:
- inta=1;
- intb=a;
- a=2;
- Console.WriteLine("b:"+b);
输出结果:
再考察一下string:
- stringa="1";
- stringb=a;
- a="2";
- Console.WriteLine("b:"+b);
输出结果:
如果不放心,还可以测试一下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);
输出结果:
结论: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);
输出结果:
结论:对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);
输出结果:
结论:问题集中在b=a这句话上。这时b指向的是a的一份copy,指向全局堆栈上的与a不同的地址。所以b和a是没有任何关系的,b不随a的改变而改变。
2) 集合
1.集合中一笔数据的增删修改。
- List
a=newList (); - List
b=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);
输出结果:
结论:b随着a中数据增减修改而变化。因为b和a指向托管堆上同一个List 实例的内存地址,这和复合类型是一样的。
数组就不说了,可以看作是多个变量的集合,所以按照集合来处理。写了几段测试代码,放在Demo中。
分享标题:分析C#中b=a的多种情况及结果
URL网址:http://www.gawzjz.com/qtweb2/news29/7329.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联