Kei*_*ith 106
从C#6开始,获取枚举名称的最佳方法是使用new nameof
运算符:
nameof(MyEnum.EnumValue);
// Ouputs
> "EnumValue"
Run Code Online (Sandbox Code Playgroud)
这在编译时工作,枚举被编译结果中的字符串替换,这反过来意味着这是最快的方法.
如果您认为枚举名称的混淆是值得的或重要的,那么任何枚举名称的使用都会干扰代码混淆 - 这可能是另一个问题.
小智 94
为我们的项目工作......
public static String convertToString(this Enum eff)
{
return Enum.GetName(eff.GetType(), eff);
}
public static EnumType converToEnum<EnumType>(this String enumValue)
{
return (EnumType) Enum.Parse(typeof(EnumType), enumValue);
}
Run Code Online (Sandbox Code Playgroud)
naw*_*fal 26
在我的测试中,Enum.GetName
速度更快,利润率也不错.内部ToString
呼叫Enum.GetName
.从 .NET 4.0的源代码,要点:
public override String ToString()
{
return Enum.InternalFormat((RuntimeType)GetType(), GetValue());
}
private static String InternalFormat(RuntimeType eT, Object value)
{
if (!eT.IsDefined(typeof(System.FlagsAttribute), false))
{
String retval = GetName(eT, value); //<== the one
if (retval == null)
return value.ToString();
else
return retval;
}
else
{
return InternalFlagsFormat(eT, value);
}
}
Run Code Online (Sandbox Code Playgroud)
我不能说这是肯定的原因,但测试状态比另一个快.这两个调用都涉及装箱(事实上它们是反射调用,你实际上是在检索字段名称),并且可能对你的喜好很慢.
测试设置:枚举8个值,没有.迭代次数= 1000000
结果:Enum.GetName => 700 ms,ToString => 2000 ms
如果速度不明显,我不会关心和使用,ToString
因为它提供了更清洁的呼叫.对比
Enum.GetName(typeof(Bla), value)
Run Code Online (Sandbox Code Playgroud)
同
value.ToString()
Run Code Online (Sandbox Code Playgroud)
Dav*_*ton 20
所有这些内部最终调用一个名为的方法InternalGetValueAsString
.之间的差异ToString
和GetName
将是GetName
必须先确认几件事情:
GetType
值来检查这个..ToString
不必担心上述任何问题,因为它是在类本身的实例上调用的,而不是在传入的版本中调用,因此,由于该.ToString
方法没有相同的验证问题作为静态方法,我会得出结论,这.ToString
是将值作为字符串获取的最快方法.
And*_*rei 20
这是最优雅的方法.
var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue);
Run Code Online (Sandbox Code Playgroud)
虽然我没有看到任何调用问题,.ToString()
因为它只是更短.
var enumValueString = MyEnum.MyValue.ToString();
Run Code Online (Sandbox Code Playgroud)
使用新的C#6语法,您可以使用:
nameof(MyEnum.MyValue)
Run Code Online (Sandbox Code Playgroud)
小智 17
我能找到的最好的是MSDN上的这个无关的问题,它包含一个回答这个问题的XML片段.这些方法中的任何一个都有相同的缺陷:它们调用enum.toString()
,在使用Dotfuscation时无法正常工作.其他问题似乎与间接装箱(GetName和Format)有关.不幸的是,我找不到使用上述任何一个的性能原因.
从xml片段中解释,
将boxed枚举传递给string.Format()或任何其他函数可以导致
enum.ToString()
被调用.这会在Dotfuscating时引起问题.你不应该使用enum.ToString()
,enum.GetNames()
,enum.GetName()
,enum.Format()
或enum.Parse()
以枚举转换为字符串.相反,请使用switch语句,并在必要时将名称国际化.
Tam*_*ege 15
Enum.GetName()
Format()
实际上只是GetName()
一些格式化功能的包装(或者InternalGetValueAsString()
确切地说).ToString()
几乎是一样的Format()
.我认为这GetName()
是最好的选择,因为它对于阅读源代码的人来说是完全明显的.
我创建了一个"描述"扩展方法并将其附加到枚举,以便我可以获得真正用户友好的命名,包括空格和套管.我从来不喜欢将枚举值本身用作可显示的文本,因为它是开发人员用来创建更易读的代码的东西.它不适用于UI显示目的.我希望能够更改UI而无需通过并更改全部枚举.