string.Empty、“ “、null 三者之间的区别

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

string.Empty、" "、null 三者之间的区别

其实对于三者来说没有太大的区别,如果非要说有点什么区别的话那就是" "与string.Empty在用法与性能上基本没区别。string.Empty是在语法级别对" "的优化,因为string.Empty与" "基本是一样的,所以string.Empty与null的区别也就代表了" "与null的区别。这样的话很多人会有不同的疑问,以前我在网上看到各式各样的解答,比如就有的人会说string.Empty不分配存储空间,然而" "就会分配一个长度为空的存储空间,其实我觉得这样的说法是并不正确的并且还含糊不清,为此我做出一点自己见解,如果问题请及时纠正

第一点就是Empty是string类中的一个静态的只读字段的,也就是说string.empty的内部实现是等于" "的。

第二点就是关于分配存储空间的问题,如我上面所说有的人会说string.Empty不分配存储空间,然而" "就会分配一个长度为空的存储空间,其实本能的来说,无论是string.Empty还是说" "都是会分配存储空间的。可以具体来说就是都会在内存的栈和堆上分配存储空间

那什么又是栈和堆呢?区别又是什么呢?

如果要说什么是栈和堆,那就有点长了,需要另写一篇了,毕竟今天写的写的重点不是他们,所以在这里只提及一下就可以了,

栈:栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表,

堆:堆使用运行期间分配给代码和堆栈以外的部分内存。

栈和堆的有三大区别:

一.堆栈空间分配区别:

1.栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

2.堆:一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二.堆栈缓存方式区别:

1.栈使用的是一级缓存,他们通常都是被调用时处于存储空间中,调用完毕立即释放;

2.堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三.堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;

栈(数据结构):一种先进后出的数据结构。

以上就是栈和堆的解析,现在回归到我们的正题,应用类型是将对象实际数据保存在堆上,将对象在堆上的地址保存在栈上,因此string.empty与" "都会在栈上保存一个地址,这个地址占用4个字节,纸箱内存堆中的某个长度为0的空间,这个空间保存的是string.Empty的实际值,可以做一些测试,用vs来测试就可以了,我这里的vs是2017版本的也是最近才下载的,所以有很多的功能未来得及尝试,所以我就无法截图出来说明了,但是我也会把重要的点说清楚的。

public void Test()用这里的代码在vs中用,找到变量str在栈中的存储的地址

   {

     for (int i = 0; i < 10000; i++)

       {

          string strA = string.Empty;/ string strB =" ";这是string.Empty和" "的写法,所以我们个写一个来作比较就可以知道" "是否也会在栈中保存一个地址

        }

    }

其实string.Empty和" "之间有什么区别的话,无非就是string.Empty在外观上看起来会比较美观,在优化方面会有一点差异。

string.Empty与””基本是一样的,所以string.Empty与null的区别也就代表了””与null的区别。String.Empty会在堆上占用一个长度为0的空间,而null不会,如下代码

string strA = "";

string strB = null;

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

strB同样会在栈上保存一个地址,这个地址也占4字节,但是这个地址是没有明确指向的。

总结:从上面写的内容来简单点来说就是null关键字是表示不引用任何对象的空引用的文字值,null是引用类型变量的默认值,而" " 和string.Empty这两个都表示的是字符串,只不过""理论上是重新开辟内存空间,而string.Empty指向一处,不过优化器会优化的。

C# 中,"空引用", "null", 和 ""(对于字符串来说)这三个概念代表了不同的含义: 1. **空引用(Null Reference)**: 这是在指针、引用类型的变量尚未被赋予有效对象时的状态。当你试图访问一个 null 的引用时,程序会抛出 NullReferenceException 异常。例如: ```csharp string myString = null; myString.Length; // 这里会抛出异常,因为 myString 没有指向任何字符串对象 ``` 2. **null 值(null literal)**: 对象类型的变量可以被初始化为 null,这意味着它并不指向任何有效的内存位置。比如在非空引用类型中,如果没有给变量分配实例,就将其设为 null。比如上面的 `myString` 就是一个 null 值的例子。 3. **空字符串(Empty String)**: 字符串类型有自己的特殊值 "”,表示长度为0但包含内容的字符串。例如: ```csharp string emptyString = ""; emptyString.Length == 0; // true,尽管它的值是 "" ``` 这里要注意的是,虽然空字符串和空引用看起来都表示“无”,但它们处理方式不同: - 空引用是针对引用类型的变量,不允许对其执行方法调用; - 空字符串是对字符串类型的一个明确值,允许进行某些操作,如长度计算。 总结一下: - 一个变量如果是 null,表示它没有指向任何对象; - 如果是空引用,尝试对其进行操作会触发异常; - 而空字符串则是长度为0但包含字符的字符串,与 null 完全不是一个概念。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值