C#中string.Empty、、null的区别
原⽂
⼀、string.Empty 和 ""
1、Empty是string类中的⼀个静态的只读字段,它是这样定义的:
// Represents the empty string. This field is read-only.
public static readonly string Empty;
  也就是说 string.Empty 的内部实现是等于 "" 的。⼆者在优化⽅⾯稍有差别,string.Empty 是 C# 对 "" 在语法级别的优化。这点可以从上⾯ string.Empty 的内部实现看出来。也就是说 "" 是通过 CLR(Common Language Runtime)进⾏优化的,CLR 会维护⼀个字符串池,以防在堆中创建重复的字符串。⽽ string.Empty 是⼀种 C# 语法级别的优化,是在C#编译器将代码编译为 IL (即 MSIL )时进⾏了优化,即所有对string类的静态字段Empty的访问都会被指向同⼀引⽤,以节省内存空间。
PS:MSIL(Microsoft Intermediate Language (MSIL)微软中间语⾔)。
2、引⽤类型的数据将对象在堆上的地址保存在"" 都会分配存储空间,具体的说是都会在内存的栈和堆上分配存储空间。因此string.Empty与“”都会在栈上保存⼀个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是string.Empty的实际值。
测试代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace string_Empty
{
class Program
{
null官方更新地址
static void Main(string[] args)
{
stringTest();
}
public static void stringTest()
{
string str;
string str1;
string str2;
string str3;
str = string.Empty;
str1 = string.Empty;
str2 = "";
str3 = "";
}
}
}
设置断点后运⾏结果如下:
可以发现这种写法下,string.Empty 和 "" 的地址是相同的。
由于 string.Empty 定义为 static readonly ,⼜根据上⾯运⾏结果得知, string.Empty 不会申请新的内存,⽽是每次去指向固定的静态只读内存区域,""也⼀样。
string.Empty 与 "" 在⽤法与性能上基本没区别。string.Empty 是在语法级别对 "" 的优化。
⼆、string.Empty 和 "" 与 null 的区别
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace string_Empty
{
class Program
{
static void Main(string[] args)
{
stringTest();
}
public static void stringTest()
{
string str;
string str1;
string str2;
str = string.Empty;
str1 = "";
str2 = null;
}
}
}
设置断点后运⾏结果如下:
从运⾏结果可以看出,string.Empty 和 "" 在栈和堆上都分配了空间,⽽ null 只在栈上分配了空间,在堆上没有分配,也即变量不引⽤内存中的任何对象。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。