字符串驻留池的另类用法
2015-11-06 02:10
225 查看
起因
事情的起因是这样的基于某些无法避免的因素
我有2个dll 暂且叫 a.dll 和 b.dll
这2个类库中有一部分完全相同的代码(下文中称为代码C)——遍历当前应用程序下的所有类库文件,并注入插件(没错,就是IOC了)
当开发人员仅引用a.dll或仅b.dll的时候,并没有任何问题
但是如果一个项目需要同时引用 a.dll 和 b.dll 那么麻烦就来了
那部分完全相同的代码会被执行2次, 所有插件都会被加载2次
经过
最简单的方案当然是把a.dll和b.dll中相同的代码 抽出成c.dll然后之前引用a.dll的 需要同时引用a.dll和c.dll
虽然可以很简单的解决问题,但是同样他的修改成本和用户体验是最差的(软件设计也要用户体验),
这个方案被保留为无论如何都无法解决问题才会使用的方案
由于a.dll和b.dll互相不知道对方的存在,所以无法直接通知对方我已经执行过代码C了
想过中Mutex,也想过用反射,都因为有各种副作用而放弃了
其他更多中间尝试各种方案的过程就不说了...
结果
最后灵光一闪,猛然想到了字符串驻留池(不了解的自己百度,或者搜博客园相关文章)string.Intern 将字符串放入驻留池
string.IsInterned 返回字符串在驻留池中的引用,如果返回null则说明该字符串没有在驻留池中
突然就有了主意了:约定一个字符串,当任何一个代码C被执行的时候,先判断这个字符串是否在驻留池中,如果不在则执行代码,执行完成后将这个字符串放入驻留池
当然这里有一个需要注意的地方,字符串如果直接固定写带代码中,在编译期间就会被放入驻留池
栗子中,xxx是硬编码在代码中的 可以看出xxx在驻留池中,而NewGuid的字符串 没有在驻留池中
所有硬编码的string都会被编译成常量,常量字符串也是在驻留池中的
加上字符串是引用类型,但是有常量的概念这个特性,所以全局锁也搞定了,直接锁定一个常量字符串就行了
所以 实际项目中的代码如下:
相关文章推荐
- 【Unity】使用Time.timeScale暂停游戏的时候的一些问题
- 研究方案
- android模拟器,Genymotion问题:Unable to start the virtual device.
- 解决adb server is out of date. killing... 报错
- maven自动部署web项目到tomcat8(向下兼容7)
- HDU 5514 【2015沈阳现场赛 F】 Frogs
- OC重点知识:代理
- Java基础语法1
- 我的第一个CSDN博客
- 顺序容器--字符串操作
- 状态已恢复七八成
- Python——Matplotlib模块在Windows下安装
- HDU 4029 Distinct Sub-matrix(哈希+后缀数组)
- 【Unity】 DoTween对UI进行DoFade操作存在问题
- SQL语句嵌套if
- Genymotion升完win10后无法打开
- JPA中L2 cache和query cache初探
- JPA中L2 cache和query cache初探
- VMWare安装CentOS图文教程
- <STL系列> 配置器