我需要多次对我的数据执行此操作:
public void AddBehavior(BehaviorTypes type)
{
if (Enum.IsDefined(typeof(BehaviorTypes), type))
{
switch (type)
{
case BehaviorTypes.render:
return new renderable();
break;
}
}
这是两个显式函数调用和一个对象装箱/拆箱操作!这个操作太昂贵了,只是为了检查一个枚举。有谁知道更便宜的替代品?
答案 0 :(得分:0)
您可以使用Enum.GetValues在优化集合中,在静态成员中,一劳永逸地提取枚举类型的所有现有值。而且您只需要在下一个搜索该集合。
我猜最快,如果只考虑一个枚举,就会出现一系列布尔值,告诉你你的积分是否存在于枚举中。除了这个数组的构造(成本一次)之外,你有一个enum到int的转换,以及一个数组中的读访问(如果我没弄错的话,这是你能得到的最快的吗?)
答案 1 :(得分:0)
关于 .NET 的一个鲜为人知的事实是您可以在枚举上声明扩展方法。避免拳击将是一个很好的理由。为了维护,您可以在与枚举相同的文件中定义静态方法,以便您知道同时更改它们。
public enum BehaviorTypes
{
Render,
Foo,
Bar
}
public static class BehaviorTypesExtensions
{
public static bool IsDefined(this BehaviorTypes behaviorTypes)
{
return behaviorTypes >= BehaviorTypes.Render && behaviorTypes <= BehaviorTypes.Bar;
}
}
class Program
{
static void Main(string[] args)
{
foreach (BehaviorTypes value in Enum.GetValues(typeof(BehaviorTypes)))
{
Console.WriteLine($"{value} is defined: {value.IsDefined()}");
}
Console.WriteLine($"43 is defined: {((BehaviorTypes)43).IsDefined()}");
// Render is defined: True
// Foo is defined: True
// Bar is defined: True
// 43 is defined: False
}
}