C#中string.Empty和null的区别详解

作者:junjie 时间:2023-05-19 16:01:45 

这是一个及其常见的问题,网上已经有关于这个问题的很多讨论。但是我觉得都是不求甚解,有一些还是在误导别人。下面我来说下我对这三者的理解,如有错误的地方请大家及时指正。

一:""与string.Empty我认为是一样的。网上有一篇被转载了几十遍的文章是这样说的string.Empty 不分配存储空间,"" 分配一个长度为空的存储空间,我认为这句话是错误并且含糊不清的。

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

public static readonly String Empty = "";

也就是说string.Empty的内部实现是等于””的。

2、我要反驳string.Empty 不分配存储空间,"" 分配一个长度为空的存储空间这个观点。首先string.Empty与""都会分配存储空间,具体的说是都会在内存的栈和堆上分配存储空间。

有一点先说明一下,引用类型是将对象是实际数据保存在堆上, 将对象在堆上的地址保存在栈上。因此string.Empty与””都会在栈上保存一个地址这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空 间保存的是string.Empty的实际值。这个我可以用VS2010跟踪下内存给大家演示。

C#中string.Empty和null的区别详解

上图中的0x01e81228即是变量str在栈中存储的地址。

对于"",请看下图

C#中string.Empty和null的区别详解

这个图的效果跟上图是一样的,也就是说””也是在栈上保存了一个地址。

3、CLR会对字符串进行优化,所以””和string.Empty也都会被优化。

声明如下两个变量


string str1=””;

string str2=””;

str1与str2的引用会是相同的也就是str1与str2在栈上保存的地址上相同的。请看下图

C#中string.Empty和null的区别详解

上图是str1的地址。
C#中string.Empty和null的区别详解

上图是str2的地址

4、如果非要说””与string.Empty有什么不同的话,我觉得1是写法不一样,string.Empty看起来好看~!~。2是在优化 方面稍有差别。string.Empty于c#对””在语法级别的优化。这点可以通过string.Empty的内部实现看出来。

public static readonly String Empty = "";

也就是说””是通过CLR进行优化的,CLR会维护一个字符串池,以防在堆中创建重复的字符串。而string.Empty是一种c#语法级别 的优化,是在C#编译器将代码编译为IL(即MSIL)时进行了优化,即所有对string类的静态字段Empty的访问都会被指向同一引用,以节省内存 空间。

所以对””的优化更依赖CLR。

给大家看一下二者编译后的IL代码:

string  str1=””;  编译后如下:

ldstr      ""         //从字符串池中取出一个””(实际上取的是地址)

stfld      string ClassLibrary1.Class1::str1   //将””赋给str1(实际上赋的是地址)

string  str2=string.Empty; 编译后如下:

ldsfld     string [mscorlib]System.String::Empty//取得string类的静态字段Empty(实际上取的是地址)

stfld      string ClassLibrary1.Class1::str2//将Empty赋给str2(实际上赋的是地址)

总结:说了这么一大推我自己都觉得罗嗦,而且初学者朋友可能会看不懂。本人语文学的不好,表达能力一般还请大家谅解,下面我会挑要害来说。

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

二、string.Empty与null的区别

因为string.Empty与””基本是一样的,所以string.Empty与null的区别也就代表了””与null的区别。

1、  那就是string.Empty会在堆上占用一个长度为0的空间,而null不会。具体内容如下:

string str1=””;

string str2=null;

如刚才所说str1会在栈上保存一个地址,这个地址占4字节,指向内存堆中的某个长度为0的空间,这个空间保存的是str1的实际值。

str2同样会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的,它哪也不指,其内容为0x00000000。如下图


C#中string.Empty和null的区别详解

标签:C#,string.Empty,null,区别
0
投稿

猜你喜欢

  • Android技巧一之启动屏+新功能左右导航逻辑

    2021-12-27 16:08:20
  • 详解Java的文件与目录管理以及输入输出相关操作

    2022-05-03 15:07:22
  • SpringBoot整合阿里云短信服务的方法

    2022-03-24 18:17:11
  • RocketMQ NameServer 核心源码解析

    2022-05-08 09:35:41
  • 那些年,我还在学习C# 学习笔记

    2021-11-09 07:08:35
  • Java JDK 二分法 分析demo(推荐)

    2022-02-28 23:29:21
  • 安卓Android6.0权限动态获取操作示例

    2023-01-26 22:56:43
  • 详解Android中Runtime解决屏幕旋转问题(推荐)

    2022-04-03 03:12:02
  • Android实现简洁的APP更新dialog数字进度条

    2023-01-29 18:53:39
  • 对指定的网页进行截图的效果 C#版

    2022-07-04 03:14:18
  • C# 中的IComparable和IComparer的使用及区别

    2023-04-19 20:11:55
  • 基于Jenkins搭建.NET Core持续集成环境过程图解

    2021-10-25 03:44:33
  • JPype实现在python中调用JAVA的实例

    2022-08-24 03:19:52
  • 计算字符串和文件MD5值的小例子

    2023-12-10 20:31:19
  • java面向对象设计原则之里氏替换原则示例详解

    2023-02-02 05:04:41
  • Python基于pyjnius库实现访问java类

    2022-01-03 12:29:06
  • Android checkbox的listView具体操作方法

    2023-10-10 06:58:33
  • C#中的自动类型转换和强制类型转换

    2023-08-10 07:11:14
  • Java实现文本编译器

    2022-10-21 18:33:20
  • SpringBoot详细讲解视图整合引擎thymeleaf

    2023-12-04 16:31:37
  • asp之家 软件编程 m.aspxhome.com