全部博文(1293)
分类: C#/.net
2013-08-29 11:47:42
【CSharp代码1】:
对应的反汇编代码:
上面的汇编代码中,””也是存在ds的堆栈中。
而s1=null的赋值则是采用 xor dex,dex,先对寄存器进行异或运行,相同为0,故寄存器dex被清0.
由此可以得出s0=“” 和 s1=null的本质区别:
string是引用类型。
s0=””,则s0得到了字符串””的引用,进行了分配内存空间的动作,只不过因为上层要求的是“”,故length()=0;
s1=null,则s1得到的引用为000为空,即是没有引用,根本没有分配内存空间!使用length()会报出异常。
实际编程过程中,a==null 和 a==””往往认为两者都表示无值。
【CSharp代码2】:
对应的反汇编代码:
上面的两个语句是有本质上的区别的:
s2 = "aa";的操作过程是先在栈中写入”aa”,再让s2指向它;
string s3 = new string('a', 2);则是堆上创建的一个“aa”的字符串对象。s3就是对象名,代表着对象的首地址。
参考文献: