VB.NET - IIF(,) - 双方都被评估。哪些情况我应该注意?

2023-12-01

我最近了解了 IIF(A,B,C) 函数。我是一名资深 VB/VB.NET 编码员,最近花了很多时间来加快 SQL 编码速度。

在 SQL 中要做的一件(明显的)常见事情如下:

select (case where @var = 0 then MyTable.Val1 else MyTable.Val2 end) from MyTable

IF(A,B,C) 将允许我在 VB.NET 中完成此操作...全部在一行上完成。

然而,我读到,无论 A 的评估结果如何,B 和 C 都会被评估。

我可以想到一些明显的情况,这是一件坏事,例如:

Dim X as integer = IIF(SomeBoolean = true, ExpensiveFunction1(), ExpensiveFunction2())

由于我将把这个纳入我的保留范围中,是否有任何更微妙的情况可能会让我在使用 IIF 时遇到麻烦?

在某些情况下,这与使用老式的方式有很大的不同:

Dim X as integer
if SomeBoolean = true then
  X = ExpensiveFunction1()
else
  X = ExpensiveFunction2()
end if

我希望将来能够避免一些烦人的性能问题和/或错误。

2016年更新

在过去的几年里,出现了一个新的 VB.NET 功能,它消除了使用 IIF() 函数的需要。

if(Something = true, ExecuteA(), ExecuteB())

仅执行 Execute() 或 ExecuteD()。最后,内联中频短路。

因此,如果您使用的是更高版本的 VB.NET(截至 2016 年),请尽可能使用此版本。


这是最常见的问题。

Z = iif(y=0, 0, x/y)  'Throws a divide by zero exception when y is 0

不要使用它来避免除以零错误。

另一个可能的逻辑错误是当 iif 的一侧或另一侧调用修改系统状态或具有输出参数的方法时。

Z = iif(FunctionA(InputOutputParam), FunctionB(InputOutputParam))
'InputOutputParam is indeterminate or at least ambiguous here.

根据我的经验,确实没有充分的理由使用 IIF。大多数情况下,它只是用来缩写代码,考虑到它可能导致的问题,它根本不值得。另外,我认为这会使代码更难阅读。

另一件棘手的事情是它返回一个装箱值(即对象数据类型),您必须将其转换回所需的类型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VB.NET - IIF(,) - 双方都被评估。哪些情况我应该注意? 的相关文章

随机推荐

  • 在 webgl 片段着色器中按颜色计算像素

    我有 2d 纹理 S 并且想要返回 3d 纹理 H 这样像素 H r g b 等于纹理 S 中颜色 rgb 的像素数 基本上是纹理 S 中颜色的直方图 我知道遮挡查询 但它仅在 webgl2 中可用 而 IIUC 即使在那里也只能使用布尔结
  • Android SeekBar 拇指自定义

    我想隐藏栏 只想显示拇指 我用 max height 0dip 做到了 但它没有完全起作用 我还想在拇指上设置文本并使用多个图像创建拇指 例如 拇指按钮像图像一样并且具有文本 并且该按钮具有尾部下字 它随着行增量而增加 关于删除背景 我设法
  • 从 python 脚本获取 shell 脚本“读取”值

    外壳脚本 你好 sh bin bash echo Enter your name read name echo Hello name 我想从 python 中调用 Hello sh 并以非交互方式填充变量 name 如何做呢 不知道如何阅读
  • 在 Swift 中的 UITableViewController 之上添加一个 UIView

    我目前使用 UITableViewController PFQueryTableViewController 我想在 TableView 顶部显示一个 UIView 理想情况下 我想在故事板中执行此操作 这样我就可以轻松地向其中添加其他标签
  • nltk下载url授权问题

    我尝试使用 nltk download 更新我的 nltk 数据 但收到 HTTP 错误 401 需要授权 当我追踪有问题的网址时 我在 downloader py 中找到了它 DEFAULT URL http nltk googlecod
  • 如何使用 GPS 在 Android 中获取我的当前位置?

    我想通过 GPS 以地址形式获取我当前的位置 我正在使用android studio 它说我的应用程序停止工作 其中有什么错误呢 有人可以帮我摆脱这个困境吗 我在 Activity main xml 文件中的代码是
  • 充气城堡:PEMReader => PEMParser

    拥有 PEM 证书 例如 BEGIN RSA PRIVATE KEY Proc Type 4 ENCRYPTED DEK Info AES 256 CBC B9846B5D1803E 使用 BC 1 46 我使用以下代码提取密钥对 int
  • 电子表格上的 Google 日期与脚本记录器中的日期不同。这是时区问题吗?

    我已在 Google 电子表格上输入了应发送电子邮件的具体日期 我有一个脚本 它从电子表格中获取值 以 1 比较 应发送的日期电子邮件 是否等于今天 如果是 则运行脚本或 2 将今天的日期输入到电子表格中 即 日期 电子邮件已发送 我看到记
  • Java Jar hell 运行时异常

    我在运行单元测试时遇到了 jar hell 的问题 java lang RuntimeException found jar hell in test classpath at org elasticsearch bootstrap Boo
  • HTML 5 本地存储

    我正在寻找一种将几乎所有 JS 和 CSS 存储在本地存储中的方法 我知道如何使用 CSS 来做到这一点 似乎工作顺利 但是 如果您尝试存储具有任何 HTML 调用的 JS 则会停止保存到本地存储 理想情况下 我只想创建一个源文件列表以供浏
  • 如何在 Angular 2 中包含 JQuery 插件?

    我在 Angular 2 项目中安装了 jquery 插件Link npm i jquery bootstrap scrolling tabs 并添加 angular cli json styles styles css node modu
  • 三元条件中的隐式转换问题[重复]

    这个问题在这里已经有答案了 可能的重复 条件运算符不能隐式转换 为什么 null 需要在这里进行显式类型转换 我进行了搜索 但没有找到关于为什么会发生以下情况的良好解释 我有两个具有共同接口的类 并且我尝试使用三元运算符初始化此接口类型的实
  • Prism 应用程序 CAL 中的菜单服务

    我正在尝试创建一个 Prism CAL 框架 这是我第一次涉足 CAL 但在设计用于注册某个区域的菜单项的服务时遇到困难 这是我到目前为止所想到的
  • C++ 中的就地构造函数是什么? [复制]

    这个问题在这里已经有答案了 可能的重复 C 的 放置新 C 中的就地构造函数是什么 e g Datatype x new y Datatype 这称为放置新运算符 它允许您提供将分配数据的内存 而无需new运算符分配它 例如 Foo f n
  • 如何将嵌套列添加到 DataFrame

    我有一个数据框df具有以下架构 root city name string nullable true person struct nullable true age long nullable true name string nulla
  • 工作日 jQuery UI 选项卡在当天打开

    我有如下工作日 jQuery UI 选项卡 我想在当前工作日打开它们 div ul li a href monday php Monday a li li a href tuesday php Tuesday a li li a href
  • iOS SwiftUI:以编程方式弹出或关闭视图

    我找不到任何关于制作方法的参考pop or a dismiss 以编程方式我用 SwiftUI 呈现的视图 在我看来 唯一的方法是使用模式中已经集成的滑动操作 如果我想禁用此功能 该怎么办 如何操作 以及导航堆栈的后退按钮 有谁知道解决方案
  • 动态调整 Iframe 的大小

    我可以看到这个问题已经被问过好几次了 但是所提出的解决方案似乎都不适合我正在构建的网站 所以我正在重新打开该线程 我正在尝试根据 iframe 内容的高度调整其大小 包含 iframe 的页面及其源页面都存在于同一域中 我已在以下每个线程中
  • ggplot:将图对齐并添加通用标签和图例

    我有一个data frame其中一个变量有多个级别 例如param1 param2and param3 所有这些水平具有相同的单位 浓度 mg L 1 但它们具有不同的值范围 例如 param1范围从0 to 0 4 param2范围从0
  • VB.NET - IIF(,) - 双方都被评估。哪些情况我应该注意?

    我最近了解了 IIF A B C 函数 我是一名资深 VB VB NET 编码员 最近花了很多时间来加快 SQL 编码速度 在 SQL 中要做的一件 明显的 常见事情如下 select case where var 0 then MyTab