溫柔的列舉陷阱

2022-03-14 16:23:39 字數 1048 閱讀 4767

去年上線的乙個專案,卻在最近出現了個比較頭疼的問題。先說明一下,該系統是個業務管理系統,

大概會處理上百個業務,每處理完乙個業務,都要給客戶發一封確認信或者說明信,信的內容是通過讀取模板加替換引數方式做成的,

模板是文字檔案,當要讀取乙個模板的內容時,先判斷記憶體中是否有該模板,如果有就直接從記憶體中讀取,

如果沒有則從檔案讀入並放入到記憶體中,記憶體中是放到hashtable中的,key為列舉型別,也就是為每一種

模板定義了乙個列舉值。問題就出在模板內容這裡,明明是辦理的a業務,

結果卻給客戶發的是關於b業務的相關說明。為什麼說頭疼呢,因為這個錯誤只在最終客戶

那裡出現過,在組內及中間客戶的環境中均不能再現,而且再最終客戶處也是時隱時現。

……經過數日的調查也未見所以然啊,最後迫不得已從最終客戶處要來了相關的dll檔案和log才發現了

問題的所在。原來,通過檢視il**發現很多引用的列舉值都變了,比如**中引用的是a型別的信,結果在il**中

卻變成了b型別。究其原因,大家都知道列舉值就是個整數,**編譯後,dll中只保留該列舉的整數值,

而如果列舉本身有變化的話,比如在中間加入了一項值,那麼該項後面列舉的值都會改變的(如果不是顯示指定值的話)

。這個時候如果只重新編譯了列舉本身,而沒有編譯各個引用列舉的地方的話,那麼就會出現張冠李戴的問題。我們的

問題就出在這裡,當時為了對應乙個bug在列舉中間加了乙個值,而只編譯了與這個bug有關的工程,其他的引用的地方

都沒有編譯,所以才……

雖然調查這個問題花了不少時間,但是感覺還是挺值的,知道了列舉的這個問題,希望大家以後用列舉的時候注意這個問題。

說起來出現這個問題也是挺不容易的,

如果不是把模板檔案儲存到記憶體中而是每次都重新讀取……     

如果不是使用列舉來標識信件……

如果不是使用預設的列舉值(沒有顯示指定列舉值)……

如果不是在列舉的中間插入了新值(而不是在最後)……

如果不是把專案做成了很多project(使得定義列舉和使用列舉在不同的編譯單元中)……

如果以前有過類似的經驗或者看過這樣的帖子(呵呵)……

列舉 你是那溫柔的陷阱嗎

最近在園子裡看了兩篇關於列舉的文章 小心列舉陷阱 和 溫柔的列舉陷阱 說的都是乙個問題 前台繫結列舉,資料庫中儲存列舉的值,當列舉更新後,資料庫中的值卻沒有更新,於是引起了一堆資料不對應的問題。在系統中,我們肯定都遇到過用列舉來儲存資料的情況,如下圖,需要顯示的是學歷,但學歷這東西畢竟不是經常改,所...

收集那些溫柔的情話

1.生氣歸生氣 又不是不喜歡你了 2.我的腦袋是個小小星球 每天只有你開著月亮列車巡遊 3.對你說的晚安 都是夢裡相見的暗號 4.皓月清涼 你是人間曙光 5.睡吧睡吧 星光給你 心慌給我 6.我愛你 所以你不用做那個聽話才能拿到小紅花的小朋友 就算你耍賴鬧小脾氣 我也最偏心你 7.拜託 不要不開心 ...

那一抹的溫柔

一切,都是夢,如夢境般,那麼不真實,那麼讓人疼。那一年,大一,乙個多麼遙遠的時光呢,那會,青澀的我,看到活潑 的你,心動在一瞬間,於是迎來了5年的愛戀,準確的說是暗戀,有時候就躲在某個角落裡,悄悄的注釋著你,這一年,是青澀的,默默注釋便是愛!大二那年,突然得知,你交了男朋友了,於是把這份愛藏在了心底...