温柔的枚举陷阱
去年上线的一个项目,却在最近出现了个比较头疼的问题。先说明一下,该系统是个业务管理系统,
大概会处理上百个业务,每处理完一个业务,都要给客户发一封确认信或者说明信,信的内容是通过读取模板加替换参数方式做成的,模板是文本文件,当要读取一个模板的内容时,先判断内存中是否有该模板,如果有就直接从内存中读取,如果没有则从文件读入并放入到内存中,内存中是放到Hashtable中的,key为枚举类型,也就是为每一种模板定义了一个枚举值。问题就出在模板内容这里,明明是办理的A业务,结果却给客户发的是关于B业务的相关说明。为什么说头疼呢,因为这个错误只在最终客户那里出现过,在组内及中间客户的环境中均不能再现,而且再最终客户处也是时隐时现。
……经过数日的调查也未见所以然啊,最后迫不得已从最终客户处要来了相关的dll文件和log才发现了问题的所在。原来,通过查看IL代码发现很多引用的枚举值都变了,比如代码中引用的是A类型的信,结果在IL代码中却变成了B类型。究其原因,大家都知道枚举值就是个整数,代码编译后,DLL中只保留该枚举的整数值, 而如果枚举本身有变化的话,比如在中间加入了一项值,那么该项后面枚举的值都会改变的(如果不是显示指定值的话。这个时候如果只重新编译了枚举本身,而没有编译各个引用枚举的地方的话,那么就会出现张冠李戴的问题。我们的问题就出在这里,当时为了对应一个bug在枚举中间加了一个值,而只编译了与这个bug有关的工程,其他的引用的地方都没有编译,所以才……
虽然调查这个问题花了不少时间,但是感觉还是挺值的,知道了枚举的这个问题,希望大家以后用枚举的时候注意这个问题。
大概会处理上百个业务,每处理完一个业务,都要给客户发一封确认信或者说明信,信的内容是通过读取模板加替换参数方式做成的,模板是文本文件,当要读取一个模板的内容时,先判断内存中是否有该模板,如果有就直接从内存中读取,如果没有则从文件读入并放入到内存中,内存中是放到Hashtable中的,key为枚举类型,也就是为每一种模板定义了一个枚举值。问题就出在模板内容这里,明明是办理的A业务,结果却给客户发的是关于B业务的相关说明。为什么说头疼呢,因为这个错误只在最终客户那里出现过,在组内及中间客户的环境中均不能再现,而且再最终客户处也是时隐时现。
……经过数日的调查也未见所以然啊,最后迫不得已从最终客户处要来了相关的dll文件和log才发现了问题的所在。原来,通过查看IL代码发现很多引用的枚举值都变了,比如代码中引用的是A类型的信,结果在IL代码中却变成了B类型。究其原因,大家都知道枚举值就是个整数,代码编译后,DLL中只保留该枚举的整数值, 而如果枚举本身有变化的话,比如在中间加入了一项值,那么该项后面枚举的值都会改变的(如果不是显示指定值的话。这个时候如果只重新编译了枚举本身,而没有编译各个引用枚举的地方的话,那么就会出现张冠李戴的问题。我们的问题就出在这里,当时为了对应一个bug在枚举中间加了一个值,而只编译了与这个bug有关的工程,其他的引用的地方都没有编译,所以才……
虽然调查这个问题花了不少时间,但是感觉还是挺值的,知道了枚举的这个问题,希望大家以后用枚举的时候注意这个问题。
上一篇:asp.net的 总结
下一篇:黑色风格的焦点图片
全部评论:
申明:本站部分文章来自网络,由于各种原因对文章的来源无从考究,如果您是“
温柔的枚举陷阱
”的原作者,若侵犯您的版权,请与我联系!在此请您原谅我的幼稚和无知!联系方法:email:ahuinan@21cn.com QQ:106494262
感谢以下网友对网站提出的建议:
1、感谢“蓝树叶kiss”网友发现一个评论漏洞。(2009-2-28)
2、感谢“陈臣”对程序优化和seo方面的建议。(2009-3-18)
感谢以下网友对网站提出的建议:
1、感谢“蓝树叶kiss”网友发现一个评论漏洞。(2009-2-28)
2、感谢“陈臣”对程序优化和seo方面的建议。(2009-3-18)
文章档案
- 作者:刘鸿海
- 来源:刘鸿海's blog
- 日期:2010-7-18 13:21:00
- 点击:93
网友投票(您觉得这篇文章怎样?)
请稍侯......
请稍侯......
文章阅读排行
随便看看
最新评论
- 站长 好!
- 网站不错<br>不知道URl是用什么生成的?
- update A
set A.OriginSalary=A.OriginSalary+B.AddSalary
from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID - update A
set A.OriginSalary=A.OriginSalary+B.AddSalary
from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID - 例子举得不好,为什么不直接用update解决呢?
update set A.OriginSalary=A.OriginSalary+B.AddSalary
from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID - 例子举得不好,为什么不直接用update解决呢?
update set A.OriginSalary=A.OriginSalary+B.AddSalary
from dbo.OriginSalary as A left join dbo.AddSalary as B on A.O_ID=B.O_ID - 恭喜站长改进 支持
- 改版了? 牛叉
- 网站不错^-^ 多多向站长学习
- 212
- 啊 是
- 9k
- 9k