个人理解同时借鉴了网上的经验,希望对大家有帮助
其实对于三者来说没有太大的区别,如果非要说有点什么区别的话那就是" "与string.Empty在用法与性能上基本没区别。string.Empty是在语法级别对" "的优化,因为string.Empty与" "基本是一样的,所以string.Empty与null的区别也就代表了" "与null的区别。这样的话很多人会有不同的疑问,以前我在网上看到各式各样的解答,比如就有的人会说string.Empty不分配存储空间,然而" "就会分配一个长度为空的存储空间,其实我觉得这样的说法是并不正确的并且还含糊不清,为此我做出一点自己见解,如果问题请及时纠正
第一点就是Empty是string类中的一个静态的只读字段的,也就是说string.empty的内部实现是等于" "的。
第二点就是关于分配存储空间的问题,如我上面所说有的人会说string.Empty不分配存储空间,然而" "就会分配一个长度为空的存储空间,其实本能的来说,无论是string.Empty还是说" "都是会分配存储空间的。可以具体来说就是都会在内存的栈和堆上分配存储空间
那什么又是栈和堆呢?区别又是什么呢?
如果要说什么是栈和堆,那就有点长了,需要另写一篇了,毕竟今天写的写的重点不是他们,所以在这里只提及一下就可以了,
栈:栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表,
堆:堆使用运行期间分配给代码和堆栈以外的部分内存。
栈和堆的有三大区别:
一.堆栈空间分配区别:
1.栈:由操作系统自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;
2.堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
二.堆栈缓存方式区别:
1.栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2.堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。
三.堆栈数据结构区别:
堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。
以上就是栈和堆的解析,现在回归到我们的正题,应用类型是将对象实际数据保存在堆上,将对象在堆上的地址保存在栈上,因此string.empty与" "都会在栈上保存一个地址,这个地址占用4个字节,纸箱内存堆中的某个长度为0的空间,这个空间保存的是string.Empty的实际值,可以做一些测试,用vs来测试就可以了,我这里的vs是2017版本的也是最近才下载的,所以有很多的功能未来得及尝试,所以我就无法截图出来说明了,但是我也会把重要的点说清楚的。
publicvoid Test()用这里的代码在vs中用,找到变量str在栈中的存储的地址
{
for (int i =0; i < 10000; i++)
{
string strA= string.Empty;/ string strB=" ";这是string.Empty和""的写法,所以我们个写一个来作比较就可以知道""是否也会在栈中保存一个地址
}
}
其实string.Empty和" "之间有什么区别的话,无非就是string.Empty在外观上看起来会比较美观,在优化方面会有一点差异。
string.Empty与””基本是一样的,所以string.Empty与null的区别也就代表了””与null的区别。String.Empty会在堆上占用一个长度为0的空间,而null不会,如下代码
string strA= "";
string strB= null;
所说strA会在栈上保存一个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是str1的实际值。
strB同样会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的。
总结:从上面写的内容来简单点来说就是null关键字是表示不引用任何对象的空引用的文字值,null是引用类型变量的默认值,而" " 和string.Empty这两个都表示的是字符串,只不过""理论上是重新开辟内存空间,而string.Empty指向一处,不过优化器会优化的