string.empty , "" , null 以及性能的比较
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 以及性能的比较的更多相关文章
- String.Empty,NULL和""的区别
String.Empty,NULL和""的区别 string.Empty就相当于"" 一般用于字符串的初始化 比如: string a; Console.Wri ...
- C#中string.Empty ,"" , null 区别
引言 String类型作为使用最频繁的类型之一,相信大家都非常熟悉,对于string赋予空值,通常有以下三种方式: String str1=null; String str2=””; String s ...
- 设置实体类型中String类型的属性值为String.Empty
/// <summary> /// 将String类型的属性值设置为String.Empty /// </summary> /// <typeparam name=&qu ...
- C# 中 string.Empty、""、null的区别
原文C# 中 string.Empty."".null的区别 一.string.Empty 和 "" 1.Empty是string类中的一个静态的只读字段,它是 ...
- string.Empty, "" 和 null 三者的区别
转载:http://www.cnblogs.com/mxxblog/archive/2013/08/22/3275387.html 这是一个及其常见的问题,网上已经有关于这个问题的很多讨论.但是我觉得 ...
- C# null,string.Empty,"",DBNull 的区别
[null] null 在C# 中是一个关键字,表示不引用任何对象的空引用的文字值. null 是引用类型变量的默认值. 普通值类型不能为 null. null 在 VS 中定位不出来具体是怎么定义的 ...
- NULL,"",String.Empty三者在C#中的区别
(1)NULLnull 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类 ...
- string.Empty与null与""
(1)NULLnull 关键字是表示不引用任何对象的空引用的文字值.null 是引用类型变量的默认值.那么也只有引用型的变量可以为NULL,如果int i=null,的话,是不可以的,因为Int是值类 ...
- asp.net(c#)中String.Empty、NULL、"" 三者到底有啥区别和联系?
开门见山,首先看下面代码,你认为结果分别是什么? string str = string.Empty; string str1 = ""; string str2 = null; ...
随机推荐
- Android中的flexboxlayout布局
提到FlexboxLayout大家估计有点模糊,它是谷歌最近开源的一个android排版库,它的前身Flexbox是2009年W3C提出了一种新的布局,可以简便.完整.响应式的实现页面布局,Flexb ...
- jsp
-----------------
- centos6.X使用Apache+Mono搭建asp.net 环境
mark 一下时间 2016年1月19日09:42:49 mono是指由Novell公司(由Xamarin发起,并由Miguel de lcaza领导的,一个致力于开创·NET在Linux上使用的开 ...
- 【腾讯Bugly干货分享】JSPatch 成长之路
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/579efa7083355a9a57a1ac5b Dev Club 是一个交流移动 ...
- 作为前端应当了解的Web缓存知识
缓存优点 通常所说的Web缓存指的是可以自动保存常见http请求副本的http设备.对于前端开发者来说,浏览器充当了重要角色.除此外常见的还有各种各样的代理服务器也可以做缓存.当Web请求到达缓存时, ...
- 简易nginx TCP反向代理设置
nginx从1.9.0开始支持TCP反向代理,之前只支持HTTP.这是我的系统示意图: 为何需要? 为什么需要反向代理?主要是: 负载均衡 方便管控 比如我现在要更新后端服务器,如果不用负载均衡的话, ...
- 使用 SecurityManager 和 Policy File 管理 Java 程序的权限
参考资料 该文中的内容来源于 Oracle 的官方文档.Oracle 在 Java 方面的文档是非常完善的.对 Java 8 感兴趣的朋友,可以从这个总入口 Java SE 8 Documentati ...
- Javascript之匿名函数
分析: 1.所谓匿名函数,从字面意思理解,就是没有名字的函数,js 用()来代替(注意,是英文状态下的括号) 2.定义形式: function (){ //to add codes that you ...
- Rxjava cold/hot Observable
create Observable分为cold以及hot两种,cold主要是静态的,每次subscribe都是从头开始互不干扰,而hot的在同一时刻获得的值是一致的 cold Observable 使 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...