Hello 大家好,今天小编来跟大伙聊聊C#的String知识吧,刚毕业工作总结的知识,望不对的地方还请大伙多多指教哈。
1.我们先来说下值类型和引用类型的区别:
1.1 定义值类型的数据存在栈内存中,可以理解为很临时的一块内存区域(定义8大基本类型的变量都存在栈内存)。
1.2 定义引用类型的数据存在堆内存中,就相当于new了一个对象,这个对象所存在的这块内存地址。
2.首先String类型是引用类型,不是8大基本类型(byte,short,int,long,char,double,float,boolean),但是String是特殊的字符串类型,就是Microsoft 已经封装好这个String类型,我们直接用就可以了,比如string.length,string.startWith,string.SubString方法。
2.2 首先看一段代码:
string a = "A";
a += "BC";
string b = "AB";
b += "C";
Console.WriteLine("a==b, Result:{0}",a==b); True
Console.WriteLine("A.equals(b),Result:{0}",a.Equals(b)); True
Console.WriteLine("Object.referenceEquals(a,b),Result:{0}",object.ReferenceEquals(a,b)); False
第一行: string a="A",是开辟了一块堆内存,存放A。
第二行 a+="BC",是a=a+"BC",其实可以这样理解: 又开辟了一块堆内存来存放"ABC",然后定义的对象a指向这块内存,以前开辟的一块内存(只用来存放"A")还存在,只不过对象a不指向它。
第三行:string b="AB",是开辟了一块堆内存,存放AB。
第四行:b+="C",程序执行是b=b+"C",执行完之后是"ABC",咦,"ABC"这块内存已经有了,我们可以把b指向这块内存啊,所以a,b都是指向同一块内存。既然分析到这,我们是否可以理解为 "ABC"存放在String常量池中,只不过是不同的对象来指向它就ok了。
好了,我们来分析下第一个输出 a==b,因为是引用类型,我们只能比较两块对象是否指向同一块内存,很显然,a==b是True很好理解。
第二个输出 a.Equals(b),这个返回结果是True也很好理解,对象的值嘛, 都是ABC,肯定相等啦。
第三个输出 object.referenceEquals(a,b)。 这个只能是C#的语法,大致翻译出来就是比较两个对象 a , b的引用值是否相等,按如上分析,应该是True啊,为啥是False??有些不解了,听我慢慢道来啊。 其实还是a+="BC"和b+="C"惹得锅,因为C#计算时用不同的算法去计算这两个值,所以得到的值也就不一样了,所以返回的是False。如果还是不明白,可以查看C#的CLR 知识可以涨涨见识哈,哈哈。
这里也涉及到C#的拆箱和装箱操作,大致意思就是: 拆箱: 引用类型变为值类型, 装箱: 值类型变为引用类型的操作。好了,大伙有什么疑问可以给我留言欧。。