• 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
    本文版权归作者和博客园共有,欢迎转载,共同学习;共同进步;但不能乱搞!
  • 相关阅读:
    【转】微信小程序开发之图片等比例缩放 获取屏幕尺寸图片尺寸 自适应
    解决vscode egg调试出现: this socket has been ended by other party【转】
    高仿Readhub小程序 微信小程序项目【原】
    git 解决二进制文件冲突
    webpack 打包编译-webkit-box-orient: vertical 后消失
    H5 history.pushState 在微信内修改url后点击用safari打开/复制链接是修改之前的页面
    vue 路由懒加载 使用,优化对比
    jq自定义多选下拉列表框
    System V IPC相关函数
    互斥锁和条件变量(pthread)相关函数
  • 原文地址:https://www.cnblogs.com/nsky/p/2921096.html
Copyright © 2020-2023  润新知