我试图像这样编写函数的return语句
Return (Not IsDbNull(result)) And (CType(result, String) = "1")
但是,当result
为DbNull
时,它会引发InvalidCastException
在我的观察中写(Not IsDbNull(result)) And 2/0 = 1
,所以在我看来CType
函数有一些特殊的东西可以在表达的其余部分之前进行评估。
我看到的东西或CType不尊重VB.NET中的评估顺序吗?有没有办法解决这个问题,而不是将我的表达式分成几个部分并将它们分配给变量?
答案 0 :(得分:5)
您几乎应该始终使用AndAlso
代替And
(以及OrElse
代替Or
)。
另一方面,如果编译的话,逻辑操作被称为短路 代码可以绕过一个表达式的评估取决于 另一种表达的结果。如果是第一个表达式的结果 evaluate评估确定操作的最终结果,没有 需要评估第二个表达
And
将评估导致此异常的两个表达式:
在
Boolean
比较中,And
运算符始终评估两者 表达式强>
您还可以使用将Nothing
或DbNull
视为空字符串的Convert.ToString
:
Return Convert.ToString(result) = "1"
答案 1 :(得分:2)
在您的情况下 - 转换为string
- 您不需要DbNull
检查并转换为字符串。
下面的代码就足够了。
Return result.ToString().Equals("1")
因为DbNull.ToString()
返回空字符串。
如果result
返回了ExecuteScalar
- 其中Nothing(null)
值可能,正如Tim Schmelter所指出的那样,您可以为null添加验证
Dim checkedResult = If(result, String.Empty)
Return checkedResult.ToString().Equals("1")
或使用静态Object.Equals
方法
Return Equals(result, "1")
如果result
是DataRow
类型的项目,则建议使用扩展方法将值转换为正确的类型
Dim value As Integer = datarow.Field(Of Integer)("IntegerColumnName")
Dim value As String = datarow.Field(Of String)("StringColumnName")
如果值为DataRow
, DbNull
将返回空字符串