在ASP.Net Core 中使用枚举类而不是枚举
前言:我相信大家在編寫代碼時經常會遇到各種狀態值,而且為了避免硬編碼和代碼中出現魔法數,通常我們都會定義一個枚舉,來表示各種狀態值,直到我看到Java中這樣使用枚舉,我再想C# 中可不可以這樣寫,今天就分享一下我的感悟。
(1)switch中使用枚舉
在沒有進某唐時我也是這樣的寫的,代碼很爛,違法了開閉原則,擴展性極差。在代碼規范中是不允許出現這樣的寫法的。對于上面的寫法可以使用設計模式來重構。后面會繼續更新設計模式的文章。
(2)類型轉換
EnumTricks.IsVolumeHigh((Volume)27);EnumTricks.High((int)Medium);關于枚舉的MSDN文檔說了什么:
“The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list. Every enumeration type has an underlying type, which can be any integral type except char. The default underlying type of the enumeration elements is int. By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1.
(1)沒有類型安全
枚舉是簡單的值類型,可以提供對無效值的保護,并且不會出現任何行為。他們是有用的,因為他們是魔法數字的改進,但就是這樣。如果要約束類型可能的值,枚舉不一定能幫助您,因為仍然可以提供無效類型。例如,此枚舉有三個值,默認情況下將具有int類型。值范圍為1到3。
這應該失敗,至少在運行時。它沒有。這真的很奇怪......在編譯期間或運行期間都不會檢測到錯誤的調用。你會覺得自己處于一個虛假的安全狀態。如果,我們把傳進去的枚舉轉換為string時,來看看這兩種情況有什么不同:
?我不知道大家平時在使用枚舉的時候,是否有意識檢查傳入的是否是有效的值。可以使用Enum.IsDefined()來檢查int值是否是一個有效的值
解決方案:如果int值在枚舉值的定義范圍內,則使用Enum.IsDefined()查找。如果在范圍內,則返回True,否則返回False。
(2)轉化
您是否嘗試過將enum轉換為int,int轉換為enum,string轉換為enum,將字符串轉換為enum的int值?如下代碼:
是不是我們日常的代碼中也有這樣的類型轉換代碼,不是說不好,只是類型轉換也是有性能損失的,如果能換中方式可以同樣實現而且還避免以上問題豈不是更好,這樣我們的代碼也更好維護和擴展,下面我們通過使用枚舉類的方式來解決這個問題。
代碼如下:
Error文件下:
異常中間件:
Response文件夾:
最后推薦一個類庫,這是我在Nuget上發現的枚舉類庫,地址:https://github.com/ardalis/SmartEnum
好了,先分享到這里,希望對你有幫助和啟發。
參考資料:
(1)https://docs.microsoft.com/zh-cn/dotnet/standard/microservices-architecture/microservice-ddd-cqrs-patterns/enumeration-classes-over-enum-types
(2)https://ardalis.com/enum-alternatives-in-c?
原文地址:https://www.cnblogs.com/runningsmallguo/p/10962414.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的在ASP.Net Core 中使用枚举类而不是枚举的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6月数据库排行:PostgreSQL和M
- 下一篇: ASP.NET Core 中的错误处理