`
coon33
  • 浏览: 6459 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

我理解的string s = string.Empty,string s = null和string s = ""三者之间的区别

阅读更多

想必对于那些不太重视.NET基础的朋友们来说,对于知道上述三者之间的详细区别,或许还真有点难度。
    我第一次碰到这个问题是在一次面试的时候,下面就允许我说说我的愚见:
    首先,先说说string s = null和string s = ""二者间的区别。从字面意义上理解,二者都是给变量初始化为空,前者可以联想Object,那么可以说“初始化为空引用”;后者呢可以说“初始化为空值”。看来二者间确实存在一种“不可告人的秘密”,当然这种区别仅仅是我们从肤浅的感性认识上的理解。从理论上说string s = null是不给它分配存储空间的,而string s = ""是给它分配一个长度为空的存储空间。
本人愚见,既然我们从感性上认识string s = ""为“空值”,而且String类型也是引用类型,那么它当然应该在堆上占个“坑位”,里面存个空值。而前者就不一样了,既然认为是“空引用”,那么它99.9%可能会在堆上占个“坑位”里面有个指针不指向任何地方。
    其次,我们说说string s = string.Empty和string s = null的区别。在这里还想说说string和String的区别,二者我们在Visual Studio环境下开发时,根本看不出来区别,因为通过智能感知反馈给我们的信息都是“表示文本,既一系列Unicode字符”。呵呵蒙了吧!我们知道,在.NET中所有引用类型和值类型都是继承自一个根类型Object,而这些“东西的”赖以生存的环境就是CTS,因为它们是在CTS中定义的,同时CTS也是依赖CLR的,所以没有CLR也就没有CTS。言归正传,我的愚见是String是大哥,因为他是在CTS中就定义好的东西了,是基于CLR的。而string仅仅是C#语法中一个String的变体,是基于C#的。二者好像没什么区别,只是在不同的环境下,特定的一种符号而已,不知道这么理解对不对?呵呵
好了,string.Empty和null是这样的,他俩都表示空,前者是一个空字符串,只不过这个字符串的值为空,但是在内存的堆中是有准确指向的,而后者只是定义了一个string 类型的引用,变量并没有指向任何地方,还是那句话它99.9%可能会在堆栈上占个“坑位”里面有个指针不指向任何地方。在使用前如果不实例化,都将报错。
    最后,通过上述我们还可以知道有3种方法可以表示字符串为空,s.Length == 0 , s == string.Empty , s == "" ,三者的性能也随着逐渐降低。
    希望有不对的大家能够及时指出,谢谢!

分享到:
评论

相关推荐

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

    下面我来说下我对这三者的理解,如有错误的地方请大家及时指正。  一:””与string.Empty我认为是一样的。网上有一篇被转载了几十遍的文章是这样说的string.Empty 不分配存储空间,”” 分配一个长度为空的存储空间...

    asp.net String.Empty NULL 不同之处

    本文就它们彼此的不同之处做一粗略说明。... string.Empty不分配存储空间 “”分配一个长度为空的存储空间 所以一般用string.Empty 为了以后跨平台,还是用string.empty 在 C# 中,大多数情况下

    C# IP定位代码实例

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

    不用正则,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# 打包 zip

    private void Unzip(string filePath1, string urlid) { if (Directory.Exists(Server.MapPath("ziptemp/" + urlid)) == false) { Directory.CreateDirectory(Server.MapPath("ziptemp/" + urlid)); } ...

    ASP.NET程序中常用的三十三种代码.txt

    ASP.NET程序中常用的三十三种代码 1. 打开新的窗口并传送参数:  传送参数: response.write("<script>window.open(’*.aspx?id="+this.DropDownList1.SelectIndex+"&id1="+...+"’)</script>")  接收参数: ...

    Interop.SpeechLib.zip

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

    Microsoft.AspNet.SignalR.2.4.0 Microsoft.AspNet.SignalR.Core.2.4.0

    姓名.Equals(string.Empty)) { GetName(message); Clients.Client(Context.ConnectionId).addMessage("用户" + 你.姓名 + "你好", contextId); } else { Clients.Client(Context.ConnectionId).addMessage...

    人民币大写转换

    public static final String EMPTY = ""; public static final String ZERO = "零"; public static final String ONE = "壹"; public static final String TWO = "贰"; public static final String THREE = "叁...

    FTP服务器 C#

    string param = string.Empty; int index = receiveString.IndexOf(' '); if (index != -1) { command = receiveString.Substring(0, index).ToUpper(); param = receiveString.Substring(command.Length)....

    Asp.net动态验证码

    if (checkCode == null || checkCode.Trim() == String.Empty) return; System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22); Graphics g = Graphics...

    iTextSharp

     string text = string.Empty;  for (int i = 1; i <= numberOfPages; ++i)  {  byte[] bufferOfPageContent = pdfReader.GetPageContent(i);  text += System.Text.Encoding.UTF8.GetString...

    上传并读取EXCEL的数据,显示到GridView中

    string currentSiteCode = string.Empty; if (sTable.Rows.Count > 0) { foreach (DataRow row in sTable.Rows)//循环读取工作薄找到符合列数条件的工作薄内容 { sheetName = row[2].ToString().Trim(); ...

    CMS.DBUtility.dll

    /// 执行Sql和Oracle滴混合事务 /// /// <param name="list">SQL命令行列表 /// <param name="oracleCmdSqlList">Oracle命令行列表 /// 执行结果 0-由于SQL造成事务失败 -1 由于Oracle造成事务失败 1-整体事务...

    ICSharpCode.SharpZipLib.dll

    private static bool ZipFileDictory(string FolderToZip, ZipOutputStream s, string ParentFolderName) { bool res = true; string[] folders, filenames; ZipEntry entry = null; FileStream fs = null; ...

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

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

    hls.min.js

    default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(n(r))for(s=Array.prototype.slice.call(arguments,1),u=r.slice(),a=u.length,l=0;l;l++)u[l].apply(this,s);return!0},r.prototype....

    任意拖动的视频播放器

    if(obj.code == "NetStream.Buffer.Empty") { bufferClip._visible = true; } }; var myVolume:Number = 0; var current_song:Number = 1; // control variables var scr = _root.main.controlBar.scrubber...

    ASP.NET常用代码

    = String.Empty) { strBuilder.Append(catchInfo).Append("\r\n"); } strBuilder.Append(ex.Message).Append("\r\n").Append(ex.StackTrace); return strBuilder.ToString(); } /// /// 实际事件日志写入方法 /// ...

    [C#]统计在线人数

    = String.Empty) { sb.Append("?"); sb.Append(System.Web.HttpContext.Current.Request.ServerVariables["QUERY_STRING"]); } return sb.ToString() ; } } /// /// 创建表 /// public void ...

Global site tag (gtag.js) - Google Analytics