zoukankan      html  css  js  c++  java
  • asp.net(c#)中String.Empty、NULL、"" 三者到底有啥区别和联系?【讨论题】

    开门见山,首先看下面代码,你认为结果分别是什么? 

           string str = string.Empty;
                string str1 = "";
                string str2 = null;
    
                bool t = string.IsNullOrEmpty(str);
                bool t1 = string.IsNullOrEmpty(str1);
                bool t2 = string.IsNullOrEmpty(str2);

    输出结果告诉我们。都是true。是不是很郁闷,怎么都是true。难道就没区别吗?

    这三种赋值的写法。想必敲过代码的都写过。纠结之余我在网上整理到如下知识。分享于此

    网络上说:string.Empty就相当于"",

    但这里说的是“相当于”,不是“等于”

    很显然上面都是赋值,但如果这样写,会报错,同时也验证了使用前必须先初始化也就是赋值。

            string str1;
    
                bool t1 = string.IsNullOrEmpty(str1);
    
                Console.WriteLine(str1);

    既然从赋值判断是相等的。那不同之处在哪里?难道在分配内存空间上?

    最常见的一个面试题就是:string str=""和string str=null有什么区别,这个大家应该都不陌生。回答都是:前者分配内存为空字符串的空间,也就是长度为空;但后者根本就不分配空间。所以从效率上来讲后者是不是划算?

    可网上有的说string str=string.Empty也不分配内存空间,开头说了,Empty相当于"",但现在Empty跟null一样都是不分配内存空间,怎么又变成一家亲了。

    网络还有这么一句话:为了以后跨平台,使用string.Empty。额。""和null不跨平台吗?

    以下也是在网络找到的解释:

    String.Empty和Null,这两个都是表示空字符串

    string str1= String.Empty,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,

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

    string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。textBox1.Text的值为零长度字符串 ""。

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

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

    判断字符串是否为空最好的方法就是 s.Length==0 !

    紧接着我还找到个有趣的实验:

    一个外国人做了一个测试,测试的对象有5种,谁的效率更高:

    s == ""

    s == string.empty

    s.equals(”")

    s.equals(string.empty)

    s.length == 0

    测试代码见:http://www.hn1c.com/diannao/dn87571/

    测试结果:

    最后得到测试的结果如下:

    [s == ""]

    空字符串, 10315.6250 毫秒 短字符串, 8307.8125 毫秒 长字符串, 8564.0625 毫秒

    [s == string.empty]

    空字符串, 3573.4375 毫秒 短字符串,8307.8125 毫秒 长字符串, 8603.1250 毫秒

    [s.equals("")]

    空字符串, 9517.1875 毫秒 短字符串, 7537.5000 毫秒 长字符串, 7576.5625 毫秒

    [s.equals(string.empty)]

    空字符串, 9540.6250 毫秒 短字符串, 7515.6250 毫秒 长字符串, 7607.8125 毫秒

    [s.length == 0]

    空字符串, 443.7500 毫秒 短字符串, 443.7500 毫秒 长字符串, 445.3125 毫秒

    很明显用字符串的length属性是最快的。

    得到以下结论:
    用s.equals("stringtocompare")来判断非空字符串是否相等,用 s.length == 0来判断是否是空字符串(注意这里不能用这个来判断字符串为null的情况,否则会出现“未将对象引用设置到对象的实例”的错误)。

    在2.0中判断字符串是否为空(包含null的情况)用string.isnullorempty(str);

    ------------------------------------------------看了大家的评论后,我继续挖掘了下-------------------------------------------

    如果看到以上信息还不怎么清晰的话,看下Empty内部定义:public static readonly string Empty  一个静态的只读字段。

    我们不妨自己测试下他们在内存分配的空间

    我们知道stirng是引用类型。引用类型是将对象的实际数据保存在堆上, 将对象在堆上的地址保存在栈上,也就是栈上的地址指向堆中的值。或者说引用类型就是指向一个存有值的一个地址。

    打开vs2012测试看在堆上开辟了啥空间

    也来做三个测试分别看看Empty,null,""分别在堆上开辟空间的情况

    图一:

    图二:

    图三:

    从图一和图二我们可以看出empty和""栈上都有地址,那说明在堆中有指向的值,这就能说明Empty和""都会开辟空间。

    但图三也有个地址,但没有任何指向。

    路过的高手进来讨论下,大家友好积极的发言,这三者到底啥区别,是不是正如以上这些解释。谢谢!

    作者: nsky
    出处: http://nsky.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,共同学习;共同进步;但不能乱搞!
  • 相关阅读:
    利用dockerfile定制镜像
    发布Docker 镜像到dockerhub
    Docker 停止容器
    133. Clone Graph
    132. Palindrome Partitioning II
    131. Palindrome Partitioning
    130. Surrounded Regions
    129. Sum Root to Leaf Numbers
    128. Longest Consecutive Sequence
    127. Word Ladder
  • 原文地址:https://www.cnblogs.com/nsky/p/2921096.html
Copyright © 2011-2022 走看看