问题现象: 提示您上次已经进行了搜狗输入法的安装或卸载要求哈从其。您在重启之后才能继续新的输入法安装卸载操作。 需要使用新安装的输入法打开该功能,请您重开程序后切入......
2016-10-04 208 搜狗输入法
不同的编程方式,程序的效率高低大不相同。为了满足不同的开发需要,每一种语言对实现同一功能都提供了几种实现方式,该选择什么实现方式,需要根据实际情况,兼顾效率与实现难易程度确定。
为便于大家对不同实现方式有更清楚的了解,本文先介绍 string.Empty 和 "" 的异同。
1、分配内存
现在,网上有些文章说,string.Empty 不分配内存,而 "" 分配一个长度为空的存储空间,这是一种错误的观点。
因为,无论是 string.Empty,还是 "" 都分配存储空间;因为字符型是引用类型,所以分配方式与引用类型一至,即把数据存储在堆上,而把对象在堆上的地址存储在栈上。
具体是,string.Empty 和 "" 都会在栈上分配一个字节为4存储空间,存储保存在堆上的长度为0空间的地址,这个空间存储的就是 string.Empty 或 "" 的数据值。如果有兴趣,可以用 VS 来跟踪内存地址,可能会更清楚。
2、CLR 优化
CLR 会自动对字符串进行优化,string.Empty 和 "" 也不例外,都会被优化。CLR 是如何优化的呢?
举例如下:
1)对 string.Empty 的优化
定义两个变量如下:
string str1 = string.Empty;
string str2 = string.Empty;
系统会先为 str1 在堆上和栈上都分配存储空间,当执行到为 str2 分配存储空间时,发现已经有相似的存储空间,就不在为 str2 分配新的存储空间,而是让 str2 与 str1 使用同一存储空间,以节省内存。
2)对 "" 的优化
对 "" 的优化与对 string.Empty 的优化基本是一样的,就不再熬述,所不同的是优化方式不一样,在下文不同点中介绍。
不同点主要表现在,优化方式的不一样。首先要清楚 string.Empty 的内部实现,如下所示:
public static readonly string empty = "";
从代码可以看出,string.Empty 是静态只读型的 "", 实质上也是 ""。但由于 string.Empty 是静态类型,就导致了优化方式的不同。
"" 是由 CLR 进行优化的,CLR 优化是通过维护一个字符串池来防止在堆中创建重复的字符串,即每当新建字符串时,都检查堆中是否已经有了相同的字符串。
string.Empty 是 C# 语法级别的优化,当 C# 编译器把源代码编译为IL(即MSIL)时,才对源代码进行优化,即所有对 string 类的静态字段 Empty 的访问都会被指向同一引用,以节省内存空间。
标签: C#
相关文章
问题现象: 提示您上次已经进行了搜狗输入法的安装或卸载要求哈从其。您在重启之后才能继续新的输入法安装卸载操作。 需要使用新安装的输入法打开该功能,请您重开程序后切入......
2016-10-04 208 搜狗输入法
腾讯游戏平台又叫做TGP,TGP怎么修复游戏,最近很多网友问这个问题,还不知道的小伙伴快点跟上小编一起来看看吧! 腾讯游戏平台(TGP)推出游戏专门修复工具,五大解决方案,七套校验流程......
2016-07-14 206 腾讯游戏平台
在win8.1中SkyDrive的功能得到了很大加强,小编也想体验一下却发现无法登陆,也无法访问文件,提示若要查看SKYDRIVE你需要使用Microsoft账户登录到这台电脑,相信有朋友也遇到过,下面说......
2016-10-15 203 SkyDrive SkyDrive无法登陆
以前Win8系统辅助IE浏览器上的内容都可以直接复制,但是不知道从什么时候开始,复制IE上的文字会弹出一个提示框,是否允许此网页访问剪贴板,那么怎么去掉Win8复制IE网页上内容时......
2017-05-08 204 IE浏览器
steam社区打不开 ?steam加载不出社区 怎么办?国内有很多steam游戏玩家,由于各种原因,steam游戏社区老是会出现打不开的问题,那么如何解决这个问题呢?下面小编就给大家分享一些原......
2022-08-17 319 steam社区打不开 steam加载不出社区