C# 中 string.Empty、""、null的区别

一、string.Empty""

1、Empty是string类中的一个静态的只读字段,它是这样定义的:

[csharp]  view plain  copy
  1. // Summary:  
  2. //     Represents the empty string. This field is read-only.  
  3. 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:MSILMicrosoft Intermediate Language (MSIL)微软中间语言)。

2、引用类型的数据将对象在堆上的地址保存在上,将对象的实际数据保存在上。string.Empty与 "" 都会分配存储空间,具体的说是都会在内存的栈和堆上分配存储空间。因此string.Empty与“”都会在栈上保存一个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是string.Empty的实际值。

        代码如下:

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace string_Empty  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             stringTest();  
  13.         }  
  14.   
  15.         public static void stringTest()  
  16.         {  
  17.             string str;  
  18.             string str1;  
  19.             string str2;  
  20.             string str3;  
  21.   
  22.             str = string.Empty;  
  23.             str1 = string.Empty;  
  24.             str2 = "";  
  25.             str3 = "";  
  26.         }  
  27.     }  
  28. }  
        设置断点后运行结果如下:


 
        可以发现这种写法下,string.Empty 和 "" 的地址是相同的。  

        由于 string.Empty 定义为 static readonly ,又根据上面运行结果得知,string.Empty 不会申请新的内存,而是每次去指向固定的静态只读内存区域,""也一样。    

        string.Empty 与 "" 在用法与性能上基本没区别。string.Empty 是在语法级别对 "" 的优化。

二、string.Empty  "" null 的区别

        代码如下:

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. namespace string_Empty  
  7. {  
  8.     class Program  
  9.     {  
  10.         static void Main(string[] args)  
  11.         {  
  12.             stringTest();  
  13.         }  
  14.   
  15.         public static void stringTest()  
  16.         {  
  17.             string str;  
  18.             string str1;  
  19.             string str2;  
  20.   
  21.             str = string.Empty;  
  22.             str1 = "";  
  23.             str2 = null;  
  24.         }  
  25.     }  
  26. }  
        设置断点后运行结果如下:


        从运行结果可以看出,string.Empty 和 "" 在栈和堆上都分配了空间,而 null 只在栈上分配了空间,在堆上没有分配,也即变量不引用内存中的任何对象。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值