空字符串的三种用法区别

网上看了N多人的“复制-黏贴”结果,可能最初的作者就写的比较飘逸,以至于大家都含糊其辞的给弄了过来,没办法,一边看一边想,最后找到了一个明白人写的,记录如下:

1、string a=null

2、string b=string.Empty

3、string c=""

对于以上,

a:值在内存的栈上定义了一个指针(引用),这个地址指针没有明确的指向。

b-c:

Empty是string的一个静态的只读字段,定义如下:Public static readonly StringEmpty=“”;

也就是说string.Empty的内部实现是等于""的。Empty和“”都分配存储空间,具体的说,都会在堆和栈上分配存储空间。

分配一个长度为空的存储空间。【在栈上保存一个地址长度为4字节,指向内存堆中的某个长度为0的空间】

同时定义两个“”,这两个的地址是一样的,同理,empty也如此。

区别:二者在用法和性能上基本没有区别,。

“”是通过CLR进行优化的,CLR会维护一个字符串池,以防止在堆中创建重复的字符串。

而empty是在语法级别对“”的优化,是在编译器将代码编译为IL时进行的优化,即所有对string类的静态字段Empty的访问都会被指向同一引用,以节省空间

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏恰童鞋骚年

C#委托与事件学习笔记

      今天跟随视频学习了一下C#中最重要的一些概念之委托与事件。老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的“...

1053
来自专栏一枝花算不算浪漫

[读书笔记]C#学习笔记七: C#4.0中微小改动-可选参数,泛型的可变性

3568
来自专栏Java进阶之路

关于java子父类关系的小坑

2581
来自专栏xiaoxi666的专栏

【模板小程序】十进制大数相加(正整数版本+整数版本【正负0】),包含合法性检查

为适应于不同用途,将大数算法写成了两个版本,分别为只处理正整数的版本和包含负数处理的版本,可根据需要选用。

1193
来自专栏大内老A

What is "Type" in managed heap?

我们知道,在程序运行过程中,每个对象(object)都是对应了一块内存,这里的对象不仅仅指的是某个具体类型的实例(instance),也包括类型(type)本身...

1937
来自专栏犀利豆的技术空间

Redis 的基础数据结构(一) 可变字符串、链表、字典

这周开始学习 Redis,看看Redis是怎么实现的。所以会写一系列关于 Redis的文章。这篇文章关于 Redis 的基础数据。阅读这篇文章你可以了解:

1003
来自专栏编程

经常出现却又容易被忽略的Java SE面试题 必看

在面试的过程中往往会遇到javase的题目,这个又是容易被忽略,来看一下是哪些呢? 1)运行时异常,非运行时异常。 运行时异常可进行处理,也可不进行处理。非运行...

2165
来自专栏蘑菇先生的技术笔记

探索C#之6.0语法糖剖析

2576
来自专栏yang0range

Java的面试基础题(二)

1)特点:存储对象;长度可变;存储对象的类型可不同 2)Collection (1)List:有序的;元素可重复,有索引 (add(index, elem...

1822
来自专栏大内老A

ASP.NET MVC三个重要的描述对象:ActionDescriptor

在Model绑定过程中会通过激活的Controller类型创建用于描述它的ControllerDescriptor对象。Controller是一组Action方...

1997

扫码关注云+社区

领取腾讯云代金券