Using GetHashCode for getting Enum int value

后端 未结 7 1184
北海茫月
北海茫月 2020-12-03 07:20

I have an enum

public enum INFLOW_SEARCH_ON
{
  ON_ENTITY_HANDLE = 0,         
  ON_LABEL = 1,                 
  ON_NODE_HANDLE = 2            
} // enum I         


        
相关标签:
7条回答
  • 2020-12-03 07:25

    You should use (int)MyEnumVariable for getting the literal value... you can also convert the other way like (INFLOW_SEARCH_ON)int

    0 讨论(0)
  • 2020-12-03 07:32

    Using GetHashCode() is incorrect. You should cast to int. Using it the way you do is asking for raptors(or Raymond) to come and eat you.

    That GetHashCode() happens to return the integer value of the enum is an implementation detail and may change in future versions of .net.

    GetHashCode() guarantees that if two values are equal their hash codes are equal too. The other way round is not guaranteed.

    My rule of thumb is that if GetHashCode were to return a constant value your program should still work correctly (but potentially be much slower) since a constant GetHashCode trivially fulfills the contract, but has bad distribution properties.

    0 讨论(0)
  • 2020-12-03 07:34

    When I did profiling, Enum.GetHashCode took a lot of cycles. I was able to improve it by using (int)Enum where possible.

    0 讨论(0)
  • 2020-12-03 07:38

    Others have said why casting to int is better.

    Another reason to not use GetHashCode is performance. It causes boxing. In my quick tests, GetHashCode was about 50 times slower (if it matters).

    0 讨论(0)
  • 2020-12-03 07:38

    I see some comments that describe the disadvantages of using GetHashCode() for many reasons.

    There are some cases where (int)INFLOW_SEARCH_ON.ON_LABEL doesn't work.

    A good way to get the int value from Enum is using GeTTypeCode() method. This method works regardlesss of the underlying type. In this case it is int.

    public enum INFLOW_SEARCH_ON
    {
     ON_ENTITY_HANDLE = 0,         
     ON_LABEL = 1,                 
     ON_NODE_HANDLE = 2            
    } // enum INFLOW_SEARCH_ON
    
    INFLOW_SEARCH_ON selectedType = INFLOW_SEARCH_ON.ON_LABEL;
    
    object val = Convert.ChangeType(selectedType, selectedType.GetTypeCode());
    Console.WriteLine(val);
    

    Output in this case is '1'.

    Reference: Get int value from enum

    0 讨论(0)
  • 2020-12-03 07:44

    You also have the option methods provided by the Enum static class. For instance:

    Enum.TryParse<TEnum>(string ValueType, out TEnum Result)
    

    If all you are trying to do is get the value of the Enum. You can get the string ValueType, e.g. "ON_ENTITY_HANDLE" with Enum.GetName(...).

    Otherwise, casting to (int) would definitely be preferred over GetHashCode().

    0 讨论(0)
提交回复
热议问题