欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

将ENUM转换为STRING 有大用

将ENUM转换为STRING


在.NET 3.5中将Enum转换为string的首选方法是什么?

  • Enum.GetName

  • Enum.Format

  • 的toString

为什么我应该比其他人更喜欢其中之一? 一个performance更好吗?

从C#6开始,获取枚举名称的最好方法是运算符的新nameof :

 nameof(MyEnum.EnumValue); // Ouputs > "EnumValue" 

这在编译时工作,枚举被编译结果中的stringreplace,这意味着这是最快的方式。

任何使用枚举名称都会干扰代码混淆,如果你认为混淆枚举名称是有价值的或重要的 – 这可能是另外一个问题。

为我们的项目工作…

 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); } 

所有这些最终都会调用一个名为InternalGetValueAsString的方法。 ToStringGetName之间的区别在于GetName必须首先validation一些事情:

  1. 您input的types不是null。

  2. 你input的types实际上是一个枚举。

  3. 您传入的值不是null。

  4. 您传递的值是枚举实际可以用作底层types或枚举types的types。 它使用GetType来检查这个值。

.ToString不必担心上述任何问题,因为它是在类本身的一个实例上调用的,而不是在传入的版本中调用,因此,由于.ToString方法没有与静态方法相同的validation问题,我会得出结论: .ToString是以stringforms获取值的最快方法。

最好的我能find的是MSDN上的这个无关的问题 ,它包含一个XML代码片段来回答这个问题。 任何这些方法共享相同的缺陷:他们调用enum.toString() ,这在使用Dotfuscation时无法正常工作。 其他问题似乎涉及间接装箱(GetName和格式)。 不幸的是,我找不到使用上述任何性能的原因。

从xml片段中解释 ,

将盒装枚举传递给string.Format()或其他任何函数都会导致调用enum.ToString() 。 这在Dotfuscating时会导致问题。 您不应该使用enum.ToString() , enum.GetNames() , enum.GetName() , enum.Format()enum.Parse()将枚举转换为string。 而是使用switch语句,并在必要时将名称国际化。

在我的testing中, 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); } } 

我不能说这是肯定的原因,但testing表明一个比另一个更快。 这两个电话都涉及拳击(实际上他们是reflection电话,你基本上是检索字段名称),并可能会慢你喜欢。

testing设置 :枚举8个值,没有。 迭代= 1000000

结果 :Enum.GetName => 700 ms,ToString => 2000 ms

如果速度不明显,我不会在乎和使用ToString因为它提供了一个更清洁的电话。 对比

 Enum.GetName(typeof(Bla), value) 

 value.ToString() 

Enum.GetName()

Format()实际上只是GetName()一个包装函数,具有一些格式化function(或者说是精确的InternalGetValueAsString() )。 ToString()Format()几乎相同。 我认为GetName()是最好的select,因为对于读取源代码的人来说,它是完全明显的。

我创build一个“描述”扩展方法,并将其附加到枚举,以便我可以得到真正的用户友好的命名,其中包括空间和套pipe。 我从来没有喜欢使用枚举值本身作为可显示的文本,因为这是我们开发人员用来创build更多的可读代码。 它不是用于UI显示的目的。 我希望能够改变用户界面,而无需通过改变枚举。

Enum.GetName(…)

这是最适合的方法。

 var enumValueString = Enum.GetName(typeof (MyEnum), MyEnum.MyValue); 

虽然我没有看到调用.ToString()任何问题,因为它只是简短。

 var enumValueString = MyEnum.MyValue.ToString(); 

使用新的C#6语法,您可以使用:

nameof(MyEnum.MyValue)

我不知道“首选”方法是什么(问100个人,得到100个不同的意见),但做什么最简单,什么工作。 GetName作品,但需要更多的击键。 ToString()似乎很好地完成了这项工作。

这也可以。

  List<string> names = Enum.GetNames(typeof(MyEnum)).ToList(); 

简单:列举一个枚举名称:

 List<String> NameList = Enum.GetNames(typeof(YourEnumName)).Cast<string>().ToList() 

来自 https://www.dovov.com/enumstring-2.html



enum 与string的转换

从enum转换为string可以用ToString()方法,如果从string转化为enum:


var domInt = Convert.ToString(row["DomInt"]);

FlightDomInt domIntEnum = (FlightDomInt)Enum.Parse(typeof(FlightDomInt), domInt);

 

var aCSeries = Convert.ToString(row["ACSeries"]);

AirCraftType aCSeriesEnum = (AirCraftType)Enum.Parse(typeof(AirCraftType), aCSeries);

————————————————

版权声明:本文为CSDN博主「EchoBag」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/csuleer/article/details/122401440

来自  https://blog.csdn.net/csuleer/article/details/122401440



https://qa.1r1g.com/sf/ask/170890331/

https://www.cnblogs.com/keatkeat/p/10807070.html

https://blog.csdn.net/stevemeng/article/details/115195980

https://www.cnblogs.com/mqingqing123/p/8456242.html

http://t.zoukankan.com/ranlin-p-2129885.html

https://www.php1.cn/detail/Asp-Net_LeiXingZ_6753b084.html

https://www.jb51.net/article/77923.htm

https://www.51cto.com/article/142328.html

https://qa.1r1g.com/sf/ask/170890331/

https://blog.csdn.net/csuleer/article/details/122401440

https://www.dovov.com/enumstring-2.html


普通分类: