我在 $COMPANY 工作,我正在帮助维护 $LEGACY_APPLICATION。它是用visual basic 6编写的。
由于缺乏 VB6 在 if 语句中执行短路评估的能力(这将大大简化这一点),我面临着做一个令人不快的复杂嵌套 if 语句。我试过AndAlso,但无济于事。必须是 VB6 之后添加的功能。
SO 某处的一些天才指出,如果你有耐心,你可以欺骗 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 语句(它们应该是等效的)