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)
这是一种处理十六进制的根本方法.Hex是人机界面细节.它总是一个字符串,一个数字的表示.类似"1234"是值1234的表示.当以十六进制表示时恰好是"4D2",但程序中的数字仍然是1234.程序应该只关注数字,而不是表示.
只有当您向人眼显示数字时才会将数字转换为十六进制.简单地使用ToString("X").并使用NumberStyles.HexNumber使用TryParse()从人类输入中解析回来.输入和输出,在任何其他方面都不应该处理十六进制.