String类型的总结

本文详细探讨了C#中String类型作为引用类型的特点,分析了字符串在内存中的存储方式,以及如何通过实例理解字符串的拼接过程。同时,对比了字符串的==运算符、Equals方法和ReferenceEquals方法的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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#的拆箱和装箱操作,大致意思就是:  拆箱:  引用类型变为值类型,  装箱:  值类型变为引用类型的操作。好了,大伙有什么疑问可以给我留言欧。。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值