程序开发 > C# > 正文

C# string.Empty和""效率比较

亮术网 2020-08-31 本网原创

不同的编程方式,程序的效率高低大不相同。为了满足不同的开发需要,每一种语言对实现同一功能都提供了几种实现方式,该选择什么实现方式,需要根据实际情况,兼顾效率与实现难易程度确定。

为便于大家对不同实现方式有更清楚的了解,本文先介绍 string.Empty 和 "" 的异同。

 

一、相同点

1、分配内存

现在,网上有些文章说,string.Empty 不分配内存,而 "" 分配一个长度为空的存储空间,这是一种错误的观点。

因为,无论是 string.Empty,还是 "" 都分配存储空间;因为字符型是引用类型,所以分配方式与引用类型一至,即把数据存储在堆上,而把对象在堆上的地址存储在栈上。

具体是,string.Empty 和 "" 都会在栈上分配一个字节为4存储空间,存储保存在堆上的长度为0空间的地址,这个空间存储的就是 string.Empty 或 "" 的数据值。如果有兴趣,可以用 VS 来跟踪内存地址,可能会更清楚。

 

2、CLR 优化

CLR 会自动对字符串进行优化,string.Empty 和 "" 也不例外,都会被优化。CLR 是如何优化的呢?

举例如下:

1)对 string.Empty 的优化

定义两个变量如下:

string str1 = string.Empty;
  string str2 = string.Empty;

系统会先为 str1 在堆上和栈上都分配存储空间,当执行到为 str2 分配存储空间时,发现已经有相似的存储空间,就不在为 str2 分配新的存储空间,而是让 str2 与 str1 使用同一存储空间,以节省内存。

 

2)对 "" 的优化

对 "" 的优化与对 string.Empty 的优化基本是一样的,就不再熬述,所不同的是优化方式不一样,在下文不同点中介绍。

 

二、不同点

不同点主要表现在,优化方式的不一样。首先要清楚 string.Empty 的内部实现,如下所示:

public static readonly string empty = "";

从代码可以看出,string.Empty 是静态只读型的 "", 实质上也是 ""。但由于 string.Empty 是静态类型,就导致了优化方式的不同。

"" 是由 CLR 进行优化的,CLR 优化是通过维护一个字符串池来防止在堆中创建重复的字符串,即每当新建字符串时,都检查堆中是否已经有了相同的字符串。

string.Empty 是 C# 语法级别的优化,当 C# 编译器把源代码编译为IL(即MSIL)时,才对源代码进行优化,即所有对 string 类的静态字段 Empty 的访问都会被指向同一引用,以节省内存空间。