三探String类型

最近看了李天平老师的《.net深入体验与实战精要》,里面提到了String类型的一些东西,我一开始是看不明的,但是后面通过与李老师

通了email之后,豁然开朗。下面就再一次写写有关String类型的一些东西吧。

          首先还是要给大家看一句话:string虽然为引用类型,但是(== 和 !=)是为了比较 string 对象(而不是引用)的值。

          还是先看看代码,如果大家可以完全看懂明白里面的意思,我觉得大家就已经掌握了90%的String类型了。

代码
string s1 = "te";
string s2 = "te";
string s3 = new string(new char[] { 't', 'e' });
string s4 = new string(new char[] { 't', 'e' });
第一种情况:
object o1 = s3;
object o2 = s4;
Console.WriteLine(o1
== o2);
Console.WriteLine(o1.Equals(o2));
第二种情况:
object o1 = s1;
object o2 = s2;
Console.WriteLine(o1
== o2);
Console.WriteLine(o1.Equals(o2));

究竟会出现什么结果呢???

           首先先解释一下

                string s1 = "te";
                string s2 = "te";
                string s3 = new string(new char[] { 't', 'e' });
                string s4 = new string(new char[] { 't', 'e' });

            如图所示,s1,s2,s3,s4的在栈中的内容就是所指向的字符串在堆中的地址,"te"在堆中的地址是1111,但是大家注意一下,c#中是没有给 s2


分配内存的,也就是s1,s2都是同一内存地址的别名,而c#分别给s3,s4分配了内存,而(==)是判断栈中的内容是否相等的。也就是判断 s1s2s3s4在栈中


的内容是否相等,显然,他们的值都是1111,所以s1==s2==s3==s4的。


           而object o1=s3和object o2=s4,就是初始化一个对象,他们所指的地址分别是s3和s4的地址,也就是栈中的地址,分别是1101和1102,


所以o1!=o2的,因为o1和o2的内存地址显然不同。


           再看看object o1=s1和object o2=s2,s1和s2都是同一个内存地址1100,所以在初始化一个object对象时,o1和o2的内存地址都是1100,


所以o1==o2的。


           相信大家都已经知道了上面的答案了吧?希望我这个解释之后,能让大家对String类型有更深一步的了解,也希望大家可以和我交流。


ps:顺便附上面的答案给大家参考

代码
string s1 = "te";
string s2 = "te";
string s3 = new string(new char[] { 't', 'e' });
string s4 = new string(new char[] { 't', 'e' });
第一种情况:
object o1 = s3;
object o2 = s4;
Console.WriteLine(o1
== o2); //false
Console.WriteLine(o1.Equals(o2)); //true
第二种情况:
object o1 = s1;
object o2 = s2;
Console.WriteLine(o1
== o2); //true
Console.WriteLine(o1.Equals(o2)); //true
posted @ 2010-05-26 21:46  李只蚊  阅读(1925)  评论(17编辑  收藏  举报