列舉 你是那溫柔的陷阱嗎

2022-03-07 18:22:37 字數 2917 閱讀 7367

最近在園子裡看了兩篇關於列舉的文章《小心列舉陷阱》和《溫柔的列舉陷阱》,說的都是乙個問題:前台繫結列舉,資料庫中儲存列舉的值,當列舉更新後,資料庫中的值卻沒有更新,於是引起了一堆資料不對應的問題。

在系統中,我們肯定都遇到過用列舉來儲存資料的情況,如下圖,需要顯示的是學歷,但學歷這東西畢竟不是經常改,所以就用列舉吧,放在資料庫中,還要新建一張表,還要左聯,太麻煩。

如是就有了以下**:

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

enum

estuetype

前台繫結時:enumutils.bindlistcontrol(this.combobox1); 

獲得繫結值時(列舉型別): enumutils.getenum(this.combobox1.selectedvalue.tostring());;

獲得顯示值時(列舉顯示名稱):enumutils.gettext(estuetype.highschool);

示例效果如下:

ok,一切問題解決

溫柔的列舉陷阱

去年上線的乙個專案,卻在最近出現了個比較頭疼的問題。先說明一下,該系統是個業務管理系統,大概會處理上百個業務,每處理完乙個業務,都要給客戶發一封確認信或者說明信,信的內容是通過讀取模板加替換引數方式做成的,模板是文字檔案,當要讀取乙個模板的內容時,先判斷記憶體中是否有該模板,如果有就直接從記憶體中讀...

你知道實現單例的最佳方法是列舉嗎?

從jdk1.5開始,可通過編寫乙個包含單個元素的列舉型別來實現單例 public enum singleton 然後就可以通過singleton.uniqueinstace.singletonoperaion來呼叫 這種方法在功能上與共有域方法相近,但它更加簡潔,無償地提供了序列化的機制,絕對防止多...

你掉進過「偽敏捷」的陷阱嗎?

摘要 任何工具或者流程如果讓人們在自己的工作環境中感到舉步維艱,那它就不能被稱為敏捷,只能稱之為 偽敏捷 2020年敏捷狀態報告 中顯示,現今許多組織還在學習如何實施敏捷。受訪者中也有大約50 的人表示,他們的團隊中只有不到一半的人在使用敏捷,而其中仍有高達84 的人承認他們的組織沒有達到高水平的能...