`
冷寒冰
  • 浏览: 252674 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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高,不需要在驻留机制上做处理。
分享到:
评论

相关推荐

    C#中string.Empty和null的区别详解

    网上有一篇被转载了几十遍的文章是这样说的string.Empty 不分配存储空间,”” 分配一个长度为空的存储空间,我认为这句话是错误并且含糊不清的。  1、实际上Empty是string类中的一个静态的只读字段,他的定义是这样...

    asp.net String.Empty NULL 不同之处

    或者用于比较: if(a==””) if(a==string.Empty) 上面两句是一样的效果。 string.Empty不分配存储空间 “”分配一个长度为空的存储空间 所以一般用string.Empty 为了以后跨平台,还是用string.empty 在 C# 中,...

    asp.net中DBNull.Value,null,String.Empty区别浅析

    不过从性能上说,用String.Empty比声明用一个””好一些——显然地,前者是String类的静态变量,无论如何使用只产生一个实例,后者用几次恐怕要产生几次了。 代码如下:string str=””; //“”:表示在栈中分配了...

    String和string区别以及string详解.doc

    标题与描述中提到的知识点是关于C#编程语言中`String`与`string`的区别,以及`string`类型的深入解析。以下是对这些知识点的详细解释: ### `String`与`string`的区别 #### 1. **位置与来源** - `String`是.NET ...

    asp.net String.IsNullOrEmpty 方法

    boolean isNull = String.isNullOrEmpty(null); // 返回 true boolean isEmpty = String.isNullOrEmpty(""); // 返回 true ``` #### 九、总结 `String.IsNullOrEmpty` 方法是.NET Framework中一个非常实用的方法,...

    C# IP定位代码实例

    if (ip == null || ip == string.Empty || ip.Length || ip.Length &gt; 15) return false; string regformat = @"^\d{1,3}[\.]\d{1,3}[\.]\d{1,3}[\.]\d{1,3}$"; Regex regex = new Regex(regformat, ...

    Interop.SpeechLib.zip

    //spVoice.Voice = spVoice.GetVoices(string.Empty, string.Empty).Item(0); spVoice.Speak(contentStr, SpeechVoiceSpeakFlags.SVSFPurgeBeforeSpeak | SpeechVoiceSpeakFlags.SVSFlagsAsync); } else { ...

    230322-045shopDemo(Swagger通过IFormFile或IFormCollection参数实例实现文件上传)

    //string _avatarPath = string.Empty; if (_customer != null && formFile != null) { if(!string.IsNullOrEmpty(_customer.Avatar)&&!_nopFileProvider.GetFileName(_customer.Avatar).Equals("Default.jpg"))

    精彩编程与编程技巧-0、(空字串)、Null、Empty、与 Nothing 的区别...

    在编程过程中,经常会遇到对变量进行初始化或判断其状态的情况,尤其是在处理数据输入、数据库操作等方面时,正确理解和区分0、空字符串(`""`)、`Null`、`Empty`以及`Nothing`等概念显得尤为重要。本文将详细探讨...

    C_中字符串操作总结.pdf

    然而,当使用`==`运算符比较字符串时,null字符串和`string.Empty`是不相等的,因为null表示没有引用任何字符串对象。但是,将字符串显式转换为Object类型后,使用`==`进行比较,会得到True: ```csharp string a =...

    c#拍照功能代码

    private string videoFileFullPath = string.Empty; private string imageFileFullPath = string.Empty; private string videoPath = @"E:\video\"; private string videoFileName = string.Empty; private string ...

    我是如何带领团队开发项目的

    - `&lt;6&gt;` 如果参数`[list]`中的`[baseEnumeration.entityType]`为`[null]`或`[string.Empty]`,返回`[-5]` - `&lt;7&gt;` 如果参数`[list]`中的`[baseEnumeration.title]`为`[null]`或`[string.Empty]`,返回`[-6]` - `...

    C# 实现中文发音或中文语音识别

    voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(0) ; } private void SetEnglishVoice() { voice.Voice = voice.GetVoices(string.Empty,string.Empty).Item(1) ; } private void ...

    C#_string_byte数组转换解析

    string hexString = string.Empty; if (bytes != null) { StringBuilder strB = new StringBuilder(); for (int i = 0; i &lt; bytes.Length; i++) { strB.Append(bytes[i].ToString("X2")); // "X2"表示16进制...

    不用正则,60行代码搞定高效Url重写

    private void context_BeginRequest(object sender, EventArgs e) { HttpApplication app = sender as HttpApplication; if (app == null) return;... app.Context.RewritePath(url, string.Empty, query); }

    语音合成与识别技术在C#中的应用

    voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(0); } // 设置英文语音 private void SetEnglishVoice() { voice.Voice = voice.GetVoices(string.Empty, string.Empty).Item(1); } // ...

    。net面试题综合集

    在C#中,`string.Empty`、空字符串`""`和`null`在比较时是不同的。`string.Empty`表示零长度的字符串,而`null`表示字符串引用没有指向任何对象。因此,`i`(`string.Empty`)等于`j`(空字符串`""`),但都不等于`k...

Global site tag (gtag.js) - Google Analytics