[转]C# 中 string.Empty、""、null的区别及对应的值判断


原文链接:
C# 中 string.Empty、""、null的区别——博客园
c#中判断对象为空的几种方式(字符串等)——博客园

string.Empty 和 ""#

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)微软中间语言)。

引用类型的数据将对象在堆上的地址保存在"" 都会分配存储空间,具体的说是都会在内存的栈和堆上分配存储空间。因此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 只在栈上分配了空间,在堆上没有分配,也即变量不引用内存中的任何对象

字符串的string.Empty、“”、null值判断#

string在C#中也是一个引用类型,但其又具有一定的特殊性。我们在使用string时,往往会把“变量值为的字符串对象”和“变量值为空字符的字符串对象”搞混。所以经常会因为对此理解不深引起好多问题,因为string是我们开发过程使用最频繁的类型之一,对于字符串的判断方法,通过对网上资料的整理和自己的实际操作经验现总结如下(以string str为例):

  • string.IsNullOrEmpty == str :它不但一次性能判断"空的字符串变量",还能判断“值为空字符串的变量”,并且还可以让代码简洁美观,判断的效率也不算低
  • str.Length == 0这种判断方式的执行效率最高,但要使用它你必须保证字符串不null,如果为null就会报出异常。
  • str == string.Empty 或 str == "": 这两种方式不推荐使用,只能判断“值为空字符串”的字符串变量,而且效率比较低
  • str == null: 这种方式不怎么推荐,原因和“str == string.Empty 或 str == ""”一样。
posted @   二次元攻城狮  阅读(1025)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
  1. 1 烟花易冷 小柔Channel
  2. 2 红颜如霜 江壹纯
  3. 3 不谓侠 小桃Channel
  4. 4 小小恋歌 新坦结衣
  5. 5 神预言 袁娅维TIARAY
神预言 - 袁娅维TIARAY
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
点击右上角即可分享
微信分享提示
主题色彩