Enum.GetHashCode()的問題


先說一下,正常如果代碼可以定義成枚舉,我是比較傾向於定義成枚舉的,類似這樣:

public enum Gender
    {
        /// <summary>
        /// 男
        /// </summary>
        [Description("男")]
        Male = 1,
        /// <summary>
        /// 女
        /// </summary>
        [Description("女")]
        Female = 2,
        /// <summary>
        /// 其他
        /// </summary>
        [Description("其他")]
        Other = 3
    }

  那么,通常,在代碼中(例如linq),我傾向於用Enum來強制轉為其他類型,這樣如果我要增加一個枚舉或者修改一個枚舉的名字,那么我很容易查到有多少需要修改的地方,所以我對於那種“定義了枚舉,卻在用的時候寫死的,諸如p.Gender=1這類的”代碼是很痛恨的,因為如果需要修改,你不知道有多少地方需要修改,所以一般我的用法是:如果需要int,那就

(int)Gender.Male;

這樣子用,需要修改的時候,只要改了枚舉定義,然后alt+shift+F10即可。。。

 

說明一下,我們項目里面用的EF+MySQL,MySQL里面的類型定義成了INT(4),這樣的話,到了Entity里面映射成的是sbyte類型,那么我們的代碼就寫成了這樣:

public enum Status : sbyte
    {
        /// <summary>
        /// 正常
        /// </summary>
        [Description("正常")]
        Normal = 1,
        /// <summary>
        /// 凍結
        /// </summary>
        [Description("凍結")]
        Frozen = 2
    }

  繼承自sbyte

在這里說明一下,我們這里用到一個叫QueryBuilder的東西,所以需要加linq查詢的條件的時候是這樣的:

deviceCondition.Equals(d => d.Status, ((sbyte)Status.Normal).ToString());

但是最初我用的時候不是這樣的,當時可能腦子抽了,為了不強制轉換,我寫成了這樣:

deviceCondition.Equals(d => d.Status, Status.Normal.GetHashCode().ToString());

看到了什么區別么?就是GetHashCode(),我在用之前甚至在另外的地方驗證了一下,確認Gender.Male.GetHashCode().ToString()返回的是1,是我要的結果,但是等到MySQL查詢不出來數據,讓我一直以為是那個QueryBuilder的In條件篩選針對DateTime類型的問題,后來才發現,Status.Normal.GetHashCode().ToString()返回的並不是我要的1,而是一個四位的數字的時候,我意識到不是QueryBuilder的問題了。

原來,如果你的Enum沒有繼承自sbyte的時候,或者繼承自Int的時候是沒有問題的(Enum默認繼承自Int?),但是,當繼承自其他類型的時候,就不一定了。。。

 

最后,以后還是強制轉換吧,既可以在編碼的時候就暴露出錯誤,也方便在修改的時候,把用到的地方一次全部修改。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM