1:什么是表驱动法.
表驱动法是一种编程模式(Scheme),从表里面查找信息而不使用逻辑语句(if 和case) 它的好处是消除代码里面到处出现的if、else、swith语句,让凌乱代码变得简明和清晰。对简单情况而言,表驱动方法可能仅仅使逻辑语句更容易和直白,但随着逻辑的越来越复杂,表驱动法就愈发有吸引力。
2:表驱动法的例子演示
假设有段程序要计算某年某月的天数
通常的做法如下:

Code
1
private void btnCalculate_Click(object sender, EventArgs e)
2
{
3
//检测输入是否正确
4
if (!CheckInput()) return;
5
6
int days = 0 ;
7
8
int month = Convert.ToInt16(txbMoth.Text);
9
10
switch (month)
11
{
12
case 1:
13
days = 31;
14
break;
15
case 2:
16
if (IsLeapYear(txbYear.Text))
17
{
18
days = 29;
19
}
20
else
21
{
22
days = 28;
23
}
24
break;
25
case 3:
26
days = 31;
27
break;
28
case 4:
29
days = 30;
30
break;
31
case 5:
32
days = 31;
33
break;
34
case 6:
35
days = 30;
36
break;
37
case 7:
38
days = 31;
39
break;
40
case 8:
41
days = 31;
42
break;
43
case 9:
44
days = 30;
45
break;
46
case 10:
47
days = 31;
48
break;
49
case 11:
50
days = 30;
51
break;
52
case 12:
53
days = 31;
54
break;
55
default:
56
break;
57
58
}
59
60
txbOutPut.Text = days.ToString();
61
}
大家可能会看到这里会出现大量的switch、case语句,其实这只是个简单的逻辑,如果在业务逻辑复杂的情况下,代码里
这些if 、else,switch,case语句必将是铺天盖地的出现。好了,我们来看看,表驱动的方法的简单应用吧

Code
1
private void btnCalculate_Click(object sender, EventArgs e)
2
{
3
if (!CheckInput()) return;
4
5
6
int[] dayPerMonth = new int[12]
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
7
int[] ldayPerMonth = new int[12]
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
8
9
int days = 0;
10
int index = Convert.ToInt16(txbMoth.Text);
11
12
if (IsLeapYear(txbYear.Text))
13
{
14
days = ldayPerMonth[index];
15
}
16
else
17
{
18
days = dayPerMonth[index];
19
}
20
21
txbOutPut.Text = days.ToString();
22
23
24
}
对比这两段代码,你会发现如果用表驱动法,你的代码将会更简洁,明了。
3:表驱动法查询数据的方式
- 直接访问(Direct Access)
- 索引访问(Index Access)
- 阶梯访问(Stair-Step Access)
4:表驱动法优点
前面一直在强调表驱动法的优点,下面我们来总结一下:
- 在适当环境下,使用它能够使代码简单、明了。
- 修改容易(易维护)、效率更高。
- 表驱动法的一个好处就是能够大量消除代码中if else, swith 判断。
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库