Post by "Carl", 02-07-2007, 18:58
-----------------------------------------------------
很多情况下我们用字符串进行 Switch/Case,因为这样有很好的扩展性。
比如:
- private void ProcessCommand(string command, object parameter)
- {
- switch (command)
- {
- case "New":
- case "Close":
- case "Save":
- case "Load":
- case "Copy":
- case "Paste":
- case "Cut":
- case "Delete":
- case "Print":
- case "PrintPreview":
- case "Refresh":
- case "Exit":
- break;
- }
- }
复制代码 这样如果我们想添加新的Command,只要再写一个case就可以,不用做任何的新的定义。
但是因为字符串的比较性能很差,时间消耗远远大于枚举类型,所以有时候必须对此加以优化。
我曾经在反汇编后的.NET Framework中见过这样的优化方法,很有启发:
- private void ProcessCommand(string command, object parameter)
- {
- switch (command.Length)
- {
- case 3:
- switch (command)
- {
- case "New":
- case "Cut":
- break;
- }
- break;
- case 4:
- switch (command)
- {
- case "Save":
- case "Load":
- case "Copy":
- case "Exit":
- break;
- }
- break;
- case 5:
- switch (command)
- {
- case "Close":
- case "Paste":
- case "Print":
- break;
- }
- break;
- case 6:
- switch (command)
- {
- case "Delete":
- break;
- }
- break;
- case 7:
- switch (command)
- {
- case "Refresh":
- break;
- }
- break;
- case 12:
- switch (command)
- {
- case "PrintPreview":
- break;
- }
- break;
- }
- }
复制代码 用字符串的长度先做判断,这样大大减少了需要比较的次数。
到了.NET 2.0之后,编译器已经可以对这样的Switch/Case自动做优化,其原理是这样的:
- private static Dictionary<string, int> tempTable;
- private static Dictionary<string, int> TempTable
- {
- get
- {
- if (tempTable == null)
- {
- tempTable = new Dictionary<string, int>();
- tempTable.Add("New", 0);
- tempTable.Add("Close", 1);
- tempTable.Add("Save", 2);
- tempTable.Add("Load", 3);
- tempTable.Add("Copy", 4);
- tempTable.Add("Paste", 5);
- tempTable.Add("Cut", 6);
- tempTable.Add("Delete", 7);
- tempTable.Add("Print", 8);
- tempTable.Add("PrintPreview", 9);
- tempTable.Add("Refresh", 10);
- tempTable.Add("Exit", 11);
- }
- return tempTable;
- }
- }
- private void ProcessCommand(string command, object parameter)
- {
- switch (TempTable[command])
- {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- case 8:
- case 9:
- case 10:
- case 11:
- break;
- }
- }
复制代码 首先使用string的hashcode在表中查到一个对应的index,再使用这个index去做switch。有点匪夷所思,但是真的很有效。string的GetHashCode的方法要比Compare快上很多。
看看上面的方法,思路开阔了不少。感觉作一个程序员还是蛮自豪的,因为我们在创造世界。 |
|