一:这种结论,个人觉得仍然存疑 
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高,不需要在驻留机制上做处理。 

string.empty , "" , null 以及性能的比较的更多相关文章

  1. String.Empty,NULL和""的区别

    String.Empty,NULL和""的区别 string.Empty就相当于"" 一般用于字符串的初始化 比如: string a; Console.Wri ...

  2. C#中string.Empty ,"" , null 区别

    引言 String类型作为使用最频繁的类型之一,相信大家都非常熟悉,对于string赋予空值,通常有以下三种方式: String str1=null; String str2=””; String s ...

  3. 设置实体类型中String类型的属性值为String.Empty

    /// <summary> /// 将String类型的属性值设置为String.Empty /// </summary> /// <typeparam name=&qu ...

  4. C# 中 string.Empty、""、null的区别

    原文C# 中 string.Empty."".null的区别 一.string.Empty 和 "" 1.Empty是string类中的一个静态的只读字段,它是 ...

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

    转载:http://www.cnblogs.com/mxxblog/archive/2013/08/22/3275387.html 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得 ...

  6. C# null,string.Empty,"",DBNull 的区别

    [null] null 在C# 中是一个关键字,表示不引用任何对象的空引用的文字值. null 是引用类型变量的默认值. 普通值类型不能为 null. null 在 VS 中定位不出来具体是怎么定义的 ...

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

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

  8. string.Empty与null与""

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

  9. asp.net(c#)中String.Empty、NULL、"" 三者到底有啥区别和联系?

    开门见山,首先看下面代码,你认为结果分别是什么? string str = string.Empty; string str1 = ""; string str2 = null; ...

随机推荐

  1. 嵌入式C语言代码的调试技巧

    在项目开发的过程中,不可避免的会遇到调试代码的情况. 刚开始写代码时,我们想看具体执行到哪儿时,往往这么写: printf("***** Code is here! *****\n" ...

  2. .NET跨平台之旅:将示例站点升级至 .NET Core 1.1 Preview 1

    今天微软发布了 .NET Core 1.1 Preview 1(详见 Announcing .NET Core 1.1 Preview 1 ),紧跟 .NET Core 前进的步伐,我们将示例站点 h ...

  3. 在Mac OS X上安装ASP.NET 5(译文)

    ASP.NET 5 运行在包括OS X的可用于多个平台的.NET Execution Environment(DNX)上.本文介绍如何在OS X上通过HomeBrew安装DNX和ASP.NET 5. ...

  4. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  5. SQL Server 索引和表体系结构(非聚集索引)

    非聚集索引 概述 对于非聚集索引,涉及的信息要比聚集索引更多一些,由于整个篇幅比较大涉及接下来的要写的“包含列的索引”,“索引碎片”等一些知识点,可能要结合起来阅读理解起来要更容易一些.非聚集索引和聚 ...

  6. Entity Framework 6 Recipes 2nd Edition(12-3)译 -> 数据库连接日志

    12-3. 数据库连接日志 问题 你想为每次与数据库的连接和断开记录日志 解决方案 EF为DbContext的连接公开了一个StateChange 事件.我们需要处理这个事件, 为每次与数据库的连接和 ...

  7. AKKA 笔记 - 有限状态机 -2

    AKKA 笔记 - 有限状态机 -2 原文地址: http://rerun.me/2016/05/22/akka-notes-finite-state-machines-2/ 在上一节的Akka FS ...

  8. php缓冲区详解

    什么是缓冲区(buffer)? 简单而言,缓冲区的作用就是,把输入或者输出的内容先放进内存,而不显示或者读取.至于为什么要有缓冲区,这是一个很广泛的问题,如果有兴趣,可以在网山找下资料. 其实缓冲区最 ...

  9. 新编码神器Atom使用纪要

    Atom是 Github 专门为程序员推出的一个跨平台文本编辑器.她很大程度上继承了SublimeText的美,而又不仅如此.有费了蛮大力气总结了一篇关于SublimeText文章: 如何优雅地使用S ...

  10. JavaScript权威设计--JavaScript对象(简要学习笔记七)

    1.with语句 语法: width(object){ statement } with语句可用于临时扩展作用域链.作用域链可以按序检索的对象列表,通过它可以进行变量名解析. with将object添 ...