枚举 ToString() 性能优化方案
针对枚举 ToString() 的性能问题,switch 方案虽然性能较好,但可维护性较差。增加或删除枚举项时需修改代码。核心痛点在于反射带来的性能损耗。
推荐使用 key-value 字典映射来优化。
示例代码
public static class TestClass
{
public static Dictionary<int, string> EnumLoginErrorNames = new Dictionary<int, string>();
static TestClass()
{
AddEnumLoginErrorToDic();
}
public enum EnumLoginError
{
用户名不存在,
密码错误,
用户被锁定,
未知错误
}
private static void AddEnumLoginErrorToDic()
{
string[] _names = Enum.GetNames(typeof(EnumLoginError));
int[] _values = Enum.GetValues(typeof(EnumLoginError)) as int[];
for (int i = 0; i < _values.Length; i++)
{
EnumLoginErrorNames.Add(_values[i], _names[i]);
}
}
}
性能测试
在 Web 环境中进行对比测试(Dictionary vs ToString)。
protected void Page_Load(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
int _max = 1000000;
_temp = ;
_temp = TestClass.EnumLoginErrorNames[()TestClass.EnumLoginError.用户被锁定];
sw.Start();
( i = ; i < _max; i++)
{
_temp = TestClass.EnumLoginErrorNames[()TestClass.EnumLoginError.用户被锁定];
}
sw.Stop();
Debug.WriteLine( + sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
( i = ; i < _max; i++)
{
_temp = TestClass.EnumLoginError.用户被锁定.ToString();
}
sw.Stop();
Debug.WriteLine( + sw.ElapsedMilliseconds);
}

