我理解的string s = string.Empty,string s = null和string s = ""三者之间的区别
Posted on 2009-09-18 16:52 Jester Zhu 阅读(4587) 评论(29) 编辑 收藏 举报 对于那些不太重视.NET基础的朋友们来说,想知道上述三者之间的详细区别,或许还真有点难度。
我第一次碰到这个问题是在一次面试的时候,下面就允许我说说我的愚见:
首先,先说说string s = null和string s = ""二者间的区别。从字面意义上理解,二者都是给变量初始化为空,前者可以联想Object,那么可以说“初始化为空引用”;后者呢可以说“初始化为空值”。看来二者间确实存在一种“不可告人的秘密”,当然这种区别仅仅是我们从肤浅的感性认识上的理解。从理论上说string s = null是不给它分配存储空间的,而string s = ""是给它分配一个长度为空的存储空间。
本人愚见,既然我们从感性上认识string s = ""为“空值”,而且String类型也是引用类型,那么它当然应该在堆上占个“坑位”,里面存个空值,而栈上保存的指向堆的一个指针。而string s = null 就不一样了,既然认为是“空引用”,那么它99.9%会在栈上占个“坑位”,里面有个指针不指向任何地方(换句话说堆上没有任何值)。
其次,我们说说string s = string.Empty和string s = null的区别。在这里还想说说string和String的区别,二者我们在Visual Studio环境下开发时,根本看不出来区别,因为通过智能感知反馈给我们的信息都是“表示文本,既一系列Unicode字符”。呵呵蒙了吧!我们知道,在.NET中所有引用类型和值类型都是继承自一个根类型Object,而这些“东西的”赖以生存的环境就是CTS,因为它们是在CTS中定义的,同时CTS也是依赖CLR的,所以没有CLR也就没有CTS。言归正传,我的愚见是String是大哥,因为他是在CTS中就定义好的东西了,是基于CLR的。而string仅仅是C#语法中一个String的变体,是基于C#的。二者好像没什么区别,只是在不同的环境下,特定的一种符号而已,不知道这么理解对不对?呵呵
好了,string.Empty和null是这样的,他俩都表示空,前者是一个空字符串,只不过这个字符串的值为空,但是在内存的栈中是有准确指向的;而后者只是定义了一个string 类型的引用,变量并没有指向任何地方,还是那句话它99.9%会在栈上占个“坑位”,里面有个指针不指向任何地方。在使用前如果不实例化,都将报错。
最后,通过上述我们还可以知道有3种方法可以表示字符串为空,s.Length == 0 , s == string.Empty , s == "" ,三者的性能也随着逐渐降低。
希望有不对的大家能够及时指出,谢谢!
我第一次碰到这个问题是在一次面试的时候,下面就允许我说说我的愚见:
首先,先说说string s = null和string s = ""二者间的区别。从字面意义上理解,二者都是给变量初始化为空,前者可以联想Object,那么可以说“初始化为空引用”;后者呢可以说“初始化为空值”。看来二者间确实存在一种“不可告人的秘密”,当然这种区别仅仅是我们从肤浅的感性认识上的理解。从理论上说string s = null是不给它分配存储空间的,而string s = ""是给它分配一个长度为空的存储空间。
本人愚见,既然我们从感性上认识string s = ""为“空值”,而且String类型也是引用类型,那么它当然应该在堆上占个“坑位”,里面存个空值,而栈上保存的指向堆的一个指针。而string s = null 就不一样了,既然认为是“空引用”,那么它99.9%会在栈上占个“坑位”,里面有个指针不指向任何地方(换句话说堆上没有任何值)。
其次,我们说说string s = string.Empty和string s = null的区别。在这里还想说说string和String的区别,二者我们在Visual Studio环境下开发时,根本看不出来区别,因为通过智能感知反馈给我们的信息都是“表示文本,既一系列Unicode字符”。呵呵蒙了吧!我们知道,在.NET中所有引用类型和值类型都是继承自一个根类型Object,而这些“东西的”赖以生存的环境就是CTS,因为它们是在CTS中定义的,同时CTS也是依赖CLR的,所以没有CLR也就没有CTS。言归正传,我的愚见是String是大哥,因为他是在CTS中就定义好的东西了,是基于CLR的。而string仅仅是C#语法中一个String的变体,是基于C#的。二者好像没什么区别,只是在不同的环境下,特定的一种符号而已,不知道这么理解对不对?呵呵
好了,string.Empty和null是这样的,他俩都表示空,前者是一个空字符串,只不过这个字符串的值为空,但是在内存的栈中是有准确指向的;而后者只是定义了一个string 类型的引用,变量并没有指向任何地方,还是那句话它99.9%会在栈上占个“坑位”,里面有个指针不指向任何地方。在使用前如果不实例化,都将报错。
最后,通过上述我们还可以知道有3种方法可以表示字符串为空,s.Length == 0 , s == string.Empty , s == "" ,三者的性能也随着逐渐降低。
希望有不对的大家能够及时指出,谢谢!
分类:
基础概念
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端