一:这种结论,个人觉得仍然存疑 
http://www.cnblogs.com/wangshuai901/archive/2012/05/06/2485657.html 
1.null

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

2.,""和String.Empty

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

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

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

关于String.Empty和Null的问题是这样的,这两个都是表示空字符串,其中有一个重点是string str1= String.Empty和 string str2=null 的区别,这样定义后,str1是一个空字符串,空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的,string str2=null,这样定义后,只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,都将报错。

二 比较赞同 
string.Empty与""存储及性能对比

首先,看一下String类

一、String类[只展示探讨部分]

public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string> 
{

public static readonly string Empty;

static String() 

    Empty = ""; 
    return; 
}

[MethodImpl(MethodImplOptions.InternalCall), SecuritySafeCritical] 
public extern String(char[] value);

}

实例化某个string对象,有两大种方式,一个需要new String(),一个不需要new,例如:

<1>调用基本构造函数:

【C#】:  string str=new string(new char[]{'a','b','c'});

【IL】:   L_0012: newobj instance void [mscorlib]System.String::.ctor(char[]) 
<2>直接赋值:

【C#】:string str="abc";

【IL】: L_0018: ldstr “abc”

在<1>中,是很平常的实例化方式,而在<2>中生成的IL代码中并没有出现newobj操作符,但出现了ldstr(推送对元数据中存储的字符串的新对象引用)。关于lbstr这种实例化string的方式,是一种驻留机制,即:字符串值相同的只实例化一次(在内存中分配一次空间),其它相同的只是统一指向第一次分配的空间。每次string str="字符串",都会从字符串驻留池中取,如果有,直接使用原来的,没有则创建新的实例。

二、Empty与“”差异分析

public static readonly string Empty; 
       static String() 
        { 
          Empty = ""; 
          return; 
        } 
  所以,当第一次实例化string类时,静态构造函数就初始化Empty,且以后直接获取只读Empty值。 
  例如: 
  string str=string.Empty;//如果这是第一次使用string类,调用静态构造函数,初始化Empty,在堆中,开辟某一空间,[000001]保存值为“”; 
  string str2=string.Empty//这是第二次使用,所以直接从内存读取到并赋值,指向原始空值堆空间[00000001]。 
  
  而直接赋值 str="";则会: 
  例如: 
  string str=“”; //如果是第一次使用string类,(结合上文string类介绍,ldstr)如同普通类,构造函数 string str=new string(char[]{''});在堆中,开辟某一空间,[000001]保存值为“”; 
  string str2=""; //这是第二次使用,(结合上文string类介绍,ldstr).NET对string有驻留机制处理,即相同的字符串值,则会继续使用原来堆中的值数据, 
                      //当然,这个过程必然会经过一系列的处理,消耗一定的性能!!!

三、分析总结

<1>在内存分配上:

string.Empty与“”,没有差别。都是一个系统上,""值对象只有一个!!!

<2>在性能上:

string.Empty高,不需要在驻留机制上做处理。

转载于:https://www.cnblogs.com/min-min-min/p/6251512.html

string.empty , , null 以及性能的比较相关推荐

  1. String.Empty,NULL和的区别

    string.Empty不分配存储空间       ""分配一个长度为空的存储空间          所以一般用string.Empty 为了以后跨平台,还是用string.emp ...

  2. String.Empty和的区别

    1.共同点 Empty是string类中的一个静态的只读字段,他的定义 public static readonly String Empty = ""; string.Empty ...

  3. NULL,,String.Empty三者在C#中的区别

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

  4. C#中的DBNull、Null、String.Empty和“”

    null可赋值任何变量,将变量置为空  DBNull只用于DataRow对象,表示数据库中的空值  String.Empty是0长度字串  Convert.IsDBNull判断是否为DBNull DB ...

  5. string.Empty和null三者的区别

    本文来讨论"",string.Empty和null三者到底有什么区别 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得都是不求甚解,有一些还是在误导别人.下面我 ...

  6. ,string.Empty和null三者的区别

    这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得都是不求甚解,有一些还是在误导别人.下面我来说下我对这三者的理解,如有错误的地方请大家及时指正. 一:""与st ...

  7. C#中的DBNull、Null、和String.Empty解释

    1.对DBNull的解释:     该类用于指示不存在某个已知值(通常在数据库应用程序中).     在数据库应用程序中,空对象是字段的有效值.该类区分空值(空对象)和未初始化值(DBNull.Val ...

  8. C#中NULL,,DBNULL,String.Empty,Convert.IsDBNull()的区别

    C#中的空值的判断较麻烦,不象在VB6中那么简单,这些各种空值的判断和理解对不熟悉的人来说,可能很麻烦,现就我在使用过程中的一点体会和大家共同分享. (1)NULL null 关键字是表示不引用任何对 ...

  9. String为null

    String类的下面特性需要注意: 1.null情况 String str1 = null; String str2 = null; String str3 = str1+str2; System.o ...

最新文章

  1. Java 包装类 自动装箱和拆箱
  2. Spring Boot Cache之缓存
  3. 【服务器】创建docker、运行jupyter相关命令
  4. ElasticSearch 插件开发
  5. 《疯狂Java讲义》(七)---- 方法
  6. c 语言基础笔试题1
  7. C# 中文简体中文繁体转换_ChineseConverter
  8. eclipse下载速度过慢的解决方法
  9. Disparity Map
  10. 【重识云原生】第六章容器基础6.4.10.3节——StatefulSet实操案例-部署WordPress 和 MySQL
  11. 使用LabVIEW进行物体追踪图像处理分析
  12. Word 一件删除所有空格
  13. EasyX的安装与使用
  14. iOS 获取手机IP 地址
  15. php 网址尾部带斜杠和不带区别,网址中带斜杠和不带斜杠的区别
  16. 计算数据集的均值、方差
  17. 第六章 电磁新理论(修补章)
  18. java8 .map是什么意思_JDK8 stream().map() 作用
  19. 计算机视觉——bbox的格式简介
  20. 4核8g mysql 配置_Mysql配置文件 4c8g优化

热门文章

  1. 的主机名_如何在Mac 上更改电脑的名称或本地局域网主机名?
  2. centos7下docker启动失败解决
  3. php密码安全检测,php – 密码安全随机字符串函数
  4. freertos内核 任务定义与切换 原理分析
  5. oracle 修改2个表,oracle学习笔记2:创建修改表
  6. 基于Java+SpringBoot+vue+node.js的图书购物商城系统详细设计和实现
  7. linux 下i2c读写命令,S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作
  8. oracle10g支持数据泵么,Oracle 10g使用数据泵(EXPDP和IMPDP)。
  9. 济源一中2021高考成绩查询入口,济源一中2019高考成绩喜报、一本二本上线人数情况...
  10. Java 输出当前目录