博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中 string.Empty、""、null的区别
阅读量:5999 次
发布时间:2019-06-20

本文共 2188 字,大约阅读时间需要 7 分钟。

原文

 

一、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          {              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 只在栈上分配了空间,在堆上没有分配,也即变量不引用内存中的任何对象。

 

转载地址:http://ipzmx.baihongyu.com/

你可能感兴趣的文章
Unity 设置窗体透明
查看>>
MFC基础类及其层次结构
查看>>
【转载】单点登陆
查看>>
关于安装Android Studio的一些问题的解决方法
查看>>
试水 Egret :TouchEvent与EnterFrame相关
查看>>
vue父子组件生命周期函数执行顺序
查看>>
访问服务器老返回一个值的原因
查看>>
二分图匹配入门题
查看>>
面向基础 c#小复习
查看>>
Quartz2D(自定义UIImageView控件)
查看>>
P1169 [ZJOI2007]棋盘制作
查看>>
webService-AXis2
查看>>
android Fragment的数据传递
查看>>
python 异常处理
查看>>
C# 打开网络文件(UNC)
查看>>
Deep Learning(深度学习)学习笔记整理系列之(八)
查看>>
时间序列分析之一次指数平滑法
查看>>
电子商务安全协议 SSL SET的探究
查看>>
Python+OpenCV图像处理(十一)—— 图像金字塔
查看>>
JPEG最优压缩参数试验【光影魔术手VS Image Optimizer】
查看>>