【发布时间】:2012-07-19 06:19:17
【问题描述】:
我在 $COMPANY 工作,我正在帮助维护 $LEGACY_APPLICATION。它是用 Visual Basic 6 编写的。
由于缺乏 VB6 在 if 语句中执行短路评估的能力(这将大大简化这一点),我面临着做一个令人不快的复杂嵌套 if 语句。我试过AndAlso,但无济于事。必须是VB6之后添加的功能。
某处某处的某位天才指出,如果您有耐心,您可以欺骗 select case 语句使其像短路 if 语句一样工作,所以我尝试了,这就是我想出的:
Select Case (True) ' pretend this is an if-else statement
Case (item Is Nothing): Exit Sub ' we got a non-element
Case ((item Is Not Nothing) And (lastSelected Is Nothing)): Set lastSelected = item ' we got our first good element
Case (item = lastSelected): Exit Sub ' we already had what we got
Case (Not item = lastSelected): Set lastSelected = item ' we got something new
End Select
这肯定有点不寻常,我不得不使用我的奇妙白板(顺便说一句,它几乎是除了计算机之外最有用的编程资源)来确保我正确映射了所有语句。
这里发生了什么事:我有一个昂贵的手术,我想尽可能避免重复。 lastSelected 是对最近传递给此计算的值的持久引用。 item 是刚刚从 GUI 接收到的参数。如果之前从未调用过该程序,lastSelected 以 Nothing 开始。 item 也可以是 Nothing。此外,如果 lastSelected 和 item 是相同的东西,则跳过计算。
如果我用 C++ 写这个,我会写:
if (item == NULL || (lastSelected != NULL && item->operator==(*lastSelected))) return;
else lastSelected = item;
但是,我不是。
问题
我怎样才能重写它以使其看起来更好并且更有意义?如果回答说“是,原因如下:X、Y、Z”或“否,原因如下:X、Y、Z”,将获得支持。
编辑
修复了 C++ 语句以匹配 VB6 语句(它们应该是等效的)
【问题讨论】:
-
我只使用了大约一个月的 Visual Basic,但我在其他现代语言方面拥有扎实的背景。
-
VB6 和 C++ sn-p 不等价。你想把 C++ sn-p 翻译成高效的 VB6 代码吗?
-
希望如此。如果您可以管理它,我也会满足于漂亮的代码,但效率是首要任务。
标签: vb6 styles short-circuiting select-case