最近在園子裡看了兩篇關於列舉的文章《小心列舉陷阱》和《溫柔的列舉陷阱》,說的都是乙個問題:前台繫結列舉,資料庫中儲存列舉的值,當列舉更新後,資料庫中的值卻沒有更新,於是引起了一堆資料不對應的問題。
在系統中,我們肯定都遇到過用列舉來儲存資料的情況,如下圖,需要顯示的是學歷,但學歷這東西畢竟不是經常改,所以就用列舉吧,放在資料庫中,還要新建一張表,還要左聯,太麻煩。
如是就有了以下**:
public enum estuetype然後資料庫中儲存的就是0、1、2,用來分別表示小學、中學、大學。
但後來,新的需求來了,需要將中學變為初中和高中。有人想當然,直接將「中學」改成「初中」,然後再在「初中」和「大學」之間加乙個「高中」,編譯無誤,ok,掛到伺服器上了。
後來客戶反應,噫?我以前不是填的大學嗎?現在怎麼變成高中生了啊?管理員拿個vs編譯半天,終於發現,原來新增了乙個「高中」後,「高中」的值變為2 了,也就是說資料庫中原來的所有學歷為2(以前表示的是大學生),現在都變成高中生了。哎,都是這溫柔的列舉惹的禍啊,於是開始擯棄列舉。
解決這個問題常用的做法有兩種:
1.新建一張表,專門用來儲存學歷
2.接著用那溫柔的列舉。
第一種方法很好的解決了這個問題,但問題在於會在資料庫中新建表,並且是一張更新不多的表,另乙個問題是如果資料量大時,左聯會影響效能。
第二種方法就需要我們很好的解決列舉的問題了,下面我就講我用列舉時的做法。
用列舉時我們也有兩種做法:第一:將列舉顯示賦值:如下:
public enum estuetype
ok,你要新加乙個高中對吧,難不到我:
public enum estuetype
新問題:dbo查資料:select * from [表名],然後發現使用者的學歷這兒,一堆0123,想當然的他認為
0代表小學
1代表初中
2代表高中
3代表大學
ok,他接下的操作就極具危險性了:他要對所有的大學生進行一次「婚前性教育培訓課」,結果...........
於是,我們想著,要不我們資料庫中直接儲存枚名稱,而不是值,也就是表中學歷字段直接儲存如「大學」。
嗯,這個辦法不錯,問題都解決了。
但好像我們學程式設計的第一節課老師就說了:不要用中文。有兩個原因:
1.中文占用更多的資料空間
2.中文程式設計總讓人感覺不是那麼專業
於是我就想:如何實現這樣的效果呢:資料庫中只儲存英文名稱:如university,別人一看就知道大學,但前台上,我要顯示的是「大學」兩個漢字,如下:
於是我就編寫了乙個列舉的通用類:
列舉操作類
using列舉申明時如下:system;
using
system.collections.generic;
using
system.linq;
using
system.text;
using
system.reflection;
using
system.data;
using
system.windows.forms;
namespace
public
class
enumutils
<
tenum
>
else
dt.rows.add(dr);}}
return
dt;}
public
static
string
gettext(tenum enuminstance)}}
return
strreturn;
}public
static
string
getvalue(tenum enuminstance)
}return
strreturn;
}public
static
tenum getenum(
string
value)
public
static
void
bindlistcontrol(listcontrol listcontrol)
}[attributeusage(attributetargets.enum
|attributetargets.field, allowmultiple
=false
)]public
class
enumdescriptionattribute : attribute
}public
enumdescriptionattribute(
string
description)
: base()}
}
**
public前台繫結時:enumutils.bindlistcontrol(this.combobox1);enum
estuetype
獲得繫結值時(列舉型別): enumutils.getenum(this.combobox1.selectedvalue.tostring());;
獲得顯示值時(列舉顯示名稱):enumutils.gettext(estuetype.highschool);
示例效果如下:
ok,一切問題解決
溫柔的列舉陷阱
去年上線的乙個專案,卻在最近出現了個比較頭疼的問題。先說明一下,該系統是個業務管理系統,大概會處理上百個業務,每處理完乙個業務,都要給客戶發一封確認信或者說明信,信的內容是通過讀取模板加替換引數方式做成的,模板是文字檔案,當要讀取乙個模板的內容時,先判斷記憶體中是否有該模板,如果有就直接從記憶體中讀...
你知道實現單例的最佳方法是列舉嗎?
從jdk1.5開始,可通過編寫乙個包含單個元素的列舉型別來實現單例 public enum singleton 然後就可以通過singleton.uniqueinstace.singletonoperaion來呼叫 這種方法在功能上與共有域方法相近,但它更加簡潔,無償地提供了序列化的機制,絕對防止多...
你掉進過「偽敏捷」的陷阱嗎?
摘要 任何工具或者流程如果讓人們在自己的工作環境中感到舉步維艱,那它就不能被稱為敏捷,只能稱之為 偽敏捷 2020年敏捷狀態報告 中顯示,現今許多組織還在學習如何實施敏捷。受訪者中也有大約50 的人表示,他們的團隊中只有不到一半的人在使用敏捷,而其中仍有高達84 的人承認他們的組織沒有達到高水平的能...