我的代码:
public enum WAVE_FORMAT : uint
{
WAVE_INVALIDFORMAT = 0x00000000, /* invalid format */
WAVE_FORMAT_1M08 = 0x00000001, /* 11.025 kHz, Mono, 8-bit */
WAVE_FORMAT_1S08 = 0x00000002 /* 11.025 kHz, Stereo, 8-bit */
}
public SayIfSupported(uint myFormat):-
foreach(uint format in Enum.GetValues(typeof(WAVE_FORMAT))){
if ((myFormat & format) == format) {
Say("Supported: " + ((WAVE_FORMAT)format).ToString());
}
}
实际的JIT代码在这里会做什么:((WAVE_FORMAT)format).ToString()
?
当尝试转换为适当的枚举值时,它是否会再次枚举?
如何优雅地避免额外的枚举?
答案 0 :(得分:1)
这不是JITTer。这是Enum.ToString()
您可以查看ReferenceSource以发现the implementation of Enum.ToString()
。
如果[Flags]
属性未应用于枚举,最终会调用此代码。 (这不是你的例子,但也许应该是!)
public virtual string GetEnumName(object value)
{
if (value == null)
throw new ArgumentNullException("value");
if (!IsEnum)
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType");
Contract.EndContractBlock();
Type valueType = value.GetType();
if (!(valueType.IsEnum || Type.IsIntegerType(valueType)))
throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnumBaseTypeOrEnum"), "value");
Array values = GetEnumRawConstantValues();
int index = BinarySearch(values, value);
if (index >= 0)
{
string[] names = GetEnumNames();
return names[index];
}
return null;
}
注意它是如何进行二进制搜索并使用反射来获取枚举名称。这不是很有效,但它比循环遍历所有枚举值更好。
如果您担心速度,可以使用简单的开关或字典来查找字符串,或者只是一个简单的数组,如果枚举值是连续的。