使用隐式枚举字段来表示数值是一种不好的做法吗?

sma*_*man 15 c# enums hex numbers naming-conventions

使用隐式枚举字段来表示数值是一种必然的坏习惯吗?

这是一个用例:我想要一种简单的方法来表示十六进制数字,并且由于C#枚举基于整数,它们看起来像是自然匹配.我不喜欢a char或者string这里,因为我必须明确验证他们的价值观.枚举的问题是数字[0-9]不是有效的字段标识符(有充分的理由).在我看来,我不需要声明数字0-9,因为它们是隐含存在的.

所以,我的十六进制数字枚举看起来像:

public enum Hex : int { 
    A = 10,
    B = 11,
    C = 12,
    D = 13,
    E = 14,
    F = 15
}
Run Code Online (Sandbox Code Playgroud)

所以,我可以写Tuple<Hex,Hex> r = Tuple.Create(Hex.F,(Hex)1);,并r.Item1.ToString() + r.Item2.ToString()会给我"F1".基本上,我的问题是,如果ToString()数字常量的值是我想要命名的枚举字段,为什么完全省略声明是有问题的?

作为枚举的替代表示可以使用一些前缀声明字段,例如:

public enum Hex : int {
    _0 = 0,
    _1 = 1,
    _2 = 2,
    _3 = 3,
    _4 = 4,
    _5 = 5,
    _6 = 6,
    _7 = 7,
    _8 = 8,
    _9 = 9, 
    A = 10,
    B = 11,
    C = 12,
    D = 13,
    E = 14,
    F = 15
}
Run Code Online (Sandbox Code Playgroud)

问题是上面的例子会给我"F_1"而不是"F1".显然,这很容易解决.我想知道我没有考虑的隐式方法是否存在其他问题.

Elo*_*off 12

这是一种不好的做法,因为这是一个聪明的技巧,这对于阅读代码的人来说是令人惊讶的.令我感到惊讶的是它确实有效,它让我说wtf.记住唯一有效的代码质量测量:

在此输入图像描述

聪明的技巧不属于那些意图由他人阅读和维护的代码.如果要将数字输出为十六进制,请使用法线将其转换为十六进制字符串String.Format("{0:X}", value)


Han*_*ant 7

这是一种处理十六进制的根本方法.Hex是人机界面细节.它总是一个字符串,一个数字的表示.类似"1234"是值1234的表示.当以十六进制表示时恰好是"4D2",但程序中的数字仍然是1234.程序应该只关注数字,而不是表示.

只有当您向人眼显示数字时才会将数字转换为十六进制.简单地使用ToString("X").并使用NumberStyles.HexNumber使用TryParse()从人类输入中解析回来.输入和输出,在任何其他方面都不应该处理十六进制.