您现在的位置: 365建站网 > 365学习 > C#中String.Empty、NULL与""的用法和区别

C#中String.Empty、NULL与""的用法和区别

文章来源:365jz.com     点击数:207    更新时间:2018-06-06 08:29   参与评论

(1)""和String.Empty的用法

   这两个都是表示空字符串。只不过""理论上重新开辟内存空间,而String.Empty指向一处。不过优化器会优化的!

   我要反驳网上有人说string.Empty 不分配存储空间,"" 分配一个长度为空的存储空间这个观点。首先string.Empty与""都会分配存储空间,具体的说是都会在内存的栈和堆上分配存储空间。,所以一般用string.Empty,为了以后跨平台,还是用string.empty。

在C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。比如:

string s = "";
string s2 = string.Empty;
if (s == string.Empty) {
//if语句成立
}


(2)NULL的用法
null 关键字是表示不引用任何对象的空引用的文字值。null 是引用类型变量的默认值。那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类型的。


(3)判定为空字符串的几种写法,按照性能从高到低的顺序是:

s.Length == 0 优于 s == string.Empty 优于 s == ""

总结:

1.String.Empty和""是一样的,都是空,习惯用string.empty。 Null和他们就有区别了,就是没有值,也没分配地址,此处可以理解成什么都没有。    

2.string str1="" 和 string str2=null 的区别。

str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,

string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。


实例论证:

一、string.Empty和""

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

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


如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛


发表评论 (207人查看0条评论)
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码: 点击我更换图片
最新评论
------分隔线----------------------------