在这里,我们将给大家分享关于为什么EnumSet有许多重载的“of”方法?的知识,让您更了解enum为什么是单例的本质,同时也会涉及到如何更有效地c#–ASP.NetMVC项目中的“主要”方法–也就是
在这里,我们将给大家分享关于为什么EnumSet有许多重载的“ of”方法?的知识,让您更了解enum为什么是单例的本质,同时也会涉及到如何更有效地c# – ASP.Net MVC项目中的“主要”方法 – 也就是在加载页面之前运行的方法?、c# – 为什么Enum.Parse()返回对象?、c# – 为什么Enum.ToString()没有返回正确的枚举名称?、Enum.values()与EnumSet.allOf()。哪一个更可取?的内容。
本文目录一览:- 为什么EnumSet有许多重载的“ of”方法?(enum为什么是单例)
- c# – ASP.Net MVC项目中的“主要”方法 – 也就是在加载页面之前运行的方法?
- c# – 为什么Enum.Parse()返回对象?
- c# – 为什么Enum.ToString()没有返回正确的枚举名称?
- Enum.values()与EnumSet.allOf()。哪一个更可取?
为什么EnumSet有许多重载的“ of”方法?(enum为什么是单例)
在遍历该EnumSet<E>
of
方法时,我看到了方法的多个重载实现of
:
public static <E extends Enum<E>> EnumSet<E> of(E e)public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2)..public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4, E e5)
然后另一个重载方法 varargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) { EnumSet<E> result = noneOf(first.getDeclaringClass()); result.add(first); for (E e : rest) result.add(e); return result;}
当此varargs可以处理其他实现时,为什么以这种方式重载此方法?有什么具体原因吗?
我已经阅读过相同的Javadoc,但是找不到任何令人信服的解释。
答案1
小编典典Varargs方法创建一个数组。
public static void foo(Object... args) { System.out.println(args.length);}
这是有效的,因为创建了隐式数组。EnumSet
是一个设计得非常快的类,因此通过创建所有额外的重载,它们可以在前几种情况下 跳过数组创建步骤
。这是特别正确的,因为在许多情况下Enum
没有那么多元素,如果有的话,EnumSet
可能不会包含所有元素。
Javadoc适用于EnumSet<E> of(E e1, E e2, E e3, E e4, Ee5)
:
创建一个最初包含指定元素的枚举集。存在此方法的重载以初始化具有一到五个元素的枚举集。提供了使用varargs功能的第六重载。此重载可用于创建最初包含任意数量的元素的枚举集,但运行速度可能比不使用varargs的重载慢。
c# – ASP.Net MVC项目中的“主要”方法 – 也就是在加载页面之前运行的方法?
有没有办法引导mvc app main方法,或者在不要求我发送页面加载请求的任何页面请求之前调用的任何内容?
解决方法
解决此问题的最简单方法是在您的IIS中安装AppFabric,然后让它自动启动您的服务.它将“戳”它配置的所有服务,以便它们始终运行和初始化.
c# – 为什么Enum.Parse()返回对象?
StatusEnum MyStatus = (StatusEnum) Enum.Parse( typeof(StatusEnum),"Active",true );
虽然这是一个完全合理的答案,您可以编写一个简化调用的方法,但它并不回答为什么Enum.Parse()返回一个对象而不是适当的枚举值的问题.为什么我必须将其转换为StatusEnum?
编辑:
基本上,问题是为什么这样的功能不是Enum类的一部分?
public static T Parse<T>(string value) where T: struct { return (T)Enum.Parse(typeof (T),value); }
这个功能完美无缺,完全符合你的期望. StatusEnum e = Enum.Parse< StatusEnum>(“Active”);.
解决方法
>它早于泛型和(即使没有:)
>泛型约束不能是枚举(在主流的.NET语言中)
因此,Object是唯一可以为任何类型的枚举工作的类型.
通过返回对象,API至少是功能性的,即使需要转换.
c# – 为什么Enum.ToString()没有返回正确的枚举名称?
Console.WriteLine("TOKEN_RIGHT = {0}",Tokens.TOKEN_RIGHT.ToString()); //prints TOKEN_OUTER Console.WriteLine("TOKEN_FROM = {0}",Tokens.TOKEN_FROM.ToString()); //prints TOKEN_FROM Console.WriteLine("TOKEN_OUTER = {0}",Tokens.TOKEN_OUTER.ToString()); //prints TOKEN_FULL
我知道当两个枚举成员具有相同的数值时,你可以得到这样的行为,但我知道,从反编译和检查运行时的值,枚举中的每个成员都有一个唯一的值.
这是enum定义的片段(由dotPeek生成):
public enum Tokens { TOKEN_OR = 134,TOKEN_AND = 135,TOKEN_NOT = 136,TOKEN_DOUBLECOLON = 137,TOKEN_ELSE = 138,TOKEN_WITH = 139,TOKEN_WITH_CHECK = 140,TOKEN_GRANT = 141,TOKEN_CREATE = 142,TOKEN_DENY = 143,TOKEN_DROP = 144,TOKEN_ADD = 145,TOKEN_SET = 146,TOKEN_REVOKE = 147,TOKEN_CROSS = 148,TOKEN_FULL = 149,TOKEN_INNER = 150,TOKEN_OUTER = 151,TOKEN_LEFT = 152,TOKEN_RIGHT = 153,TOKEN_UNION = 154,TOKEN_JOIN = 155,TOKEN_PIVOT = 156,TOKEN_UNPIVOT = 157,TOKEN_FROM = 242,}
为什么会这样?有什么我做错了,或者这只是.NET中那些有趣的枚举怪癖之一?如果是后者,是否有解决方法?
(对于它的价值,Tokens是.NET中Microsoft.SqlServer.Management.SqlParser.Parser命名空间的一部分.)
解决方法
您的代码(在设计/编译时)引用了一个较新的版本(因为当您使用dotpeek检查DLL时,您可以使用TOKEN_FROM,但它不存在).但是,在运行时加载的程序集是具有不同基础值的旧版本,因此名称不匹配.
您将不得不调查它是如何引用不匹配的DLL的.它可能是执行机器上安装的框架,或者您可能在相同的解决方案中引用了不同版本的项目,或者可能是其他原因(无法根据您提供的信息确定).
一旦解决了为什么引用两个不同版本并将其统一到单个程序集版本,Enum.ToString()结果应该如您所愿.
Enum.values()与EnumSet.allOf()。哪一个更可取?
我仔细研究了EnumSet.allOf
它,它看起来非常高效,尤其是对于值小于64的枚举。
基本上,所有集合共享所有可能的枚举值的单个数组,而唯一的另一条信息是位掩码,如果allOf
设置为一,则将其设置为。
另一方面,Enum.values()似乎有点黑魔法。此外,它返回一个数组,而不是一个集合,因此在许多情况下,必须用Arrays.asList()装饰它,以便在任何需要集合的地方使用。
那么,应该EnumSet.allOf
更可取Enum.values
吗?
更具体地说,for
应使用哪种形式的迭代器:
for ( final MyEnum val: MyEnum.values( ) );
要么
for ( final MyEnum val: EnumSet.allOf( MyEnum.class ) );
关于为什么EnumSet有许多重载的“ of”方法?和enum为什么是单例的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于c# – ASP.Net MVC项目中的“主要”方法 – 也就是在加载页面之前运行的方法?、c# – 为什么Enum.Parse()返回对象?、c# – 为什么Enum.ToString()没有返回正确的枚举名称?、Enum.values()与EnumSet.allOf()。哪一个更可取?的相关信息,请在本站寻找。
本文标签: