我想用来自 MySql 数据库的数据初始化一个类。一些字段可以为空:
Dim dr As MySqlDataReader = ...
Dim item As New Item(dr.GetInt16(0), dr.GetString(1), dr.GetString(2))
假设数据库中的最后两个字段可能为 NULL,因此在该字段上调用 GetString 会导致异常。
在获取每个字段之前,我当然可以编写代码来测试 NULL:
dim field1 as String
if ( dr.IsDbNull(1) )
field1 = Nothing ' or even ""
else
field1 = dr.GetString(1)
但是,如果您有很多字段,这将是“如果”的噩梦。
为此,我重写了 IIf VB 函数以使其更具类型化,从而避免强制转换:
Namespace Util
Public Shared Function IIf(Of T)(ByVal condition As Boolean, ByVal iftrue As T, ByVal iffalse As T) As T
If condition Then Return iftrue Else Return iffalse
End Function
这样我就可以写出类似的东西:
Dim item As New Item(
dr.GetInt16(0),
Util.IIf(dr.IsDbNull(1), "", dr.GetString(1),
Util.IIf(dr.IsDbNull(2), "", dr.GetString(2))
类型化的IIf在其他情况下效果很好,但不幸的是在这种情况下它不是,因为它是一个普通函数而不是语言关键字,每个 inpout 参数都会在调用期间进行评估,并且当字段为 NULL 时引发异常.
你能想出一个优雅的 if-less 解决方案吗?