.Net 中的 String.Intern 方法

偶然一次String. 的时候发现了里面有String.Intern和String.IsInterned两个方法,也没太在意,心想也不会用到,就没去研究

今天在看书的时候讲到这里,说到了原理及一些它存在的理由、应用的场合,特此记录一下:

首先我们都知道.net中的String类型都是固定的(immutable), 即创建后就不可以修改(不能变长、变短、字符变化)

我们通常会用字面的常量去初始化一个字符串类,如 var s = "hello, world" ,这里面有几件事情:

1.会把这个字面常量hello, world 放到程序集的metadata中

2.会在托管堆上创建一个值为hello,world的对象, 并且把堆上对象的地址返回给变量s

 

然而,如果我们在多个地方用到hello,world这个字符串对象的时候,每一次都会在堆上创建一个相应的对象, 微软觉得这样很浪费内存(conserve memory usage),既然

hello,world 是固定的只有一份,那么如果我们也只有唯一的一个含hello,world值的字符串实例就好了,这就是String.Intern的初衷

 

在.net内部, 当我们String.Intern一个字符串的时候,如:String.Intern("hello world"), 其会有如下操作:

在一个内部字典中添加一个以hello world为key, 字符串引用为value的值 (如果存在就直接返回key对应的value), 这样的话就保证了字符串实例的唯一性

 

由于字符串对应的对象现在是唯一的了,那么我们现在就可以应用Object.ReferenceEquals判断字符串是否相等了(实际上是判断实例的唯一性), 相比原始字符串的比较

(1.是否长度相等 2.如果不等,那么每个字符相比较)效率高了很多,因为现在只需比较两个实例是否指向同一个对象就可以了

 

但是,应用这个方法也不是完美的,是付出了一定的代价,那就是构建字典、字典中查询值这些操作

 

所以,在应用的时候要根据自己的情况判定,这样的优化是否值得 ; )

posted on 2011-12-23 14:42 一颗卤蛋 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/lyroge/archive/2011/12/23/2299414.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值