在表达的其余部分之前评估CType

时间:2017-01-06 15:04:04

标签: vb.net

我试图像这样编写函数的return语句

Return (Not IsDbNull(result)) And (CType(result, String) = "1")

但是,当resultDbNull时,它会引发InvalidCastException

在我的观察中写(Not IsDbNull(result)) And 2/0 = 1,所以在我看来CType函数有一些特殊的东西可以在表达的其余部分之前进行评估。

我看到的东西或CType不尊重VB.NET中的评估顺序吗?有没有办法解决这个问题,而不是将我的表达式分成几个部分并将它们分配给变量?

2 个答案:

答案 0 :(得分:5)

您几乎应该始终使用AndAlso代替And(以及OrElse代替Or)。

  

如果编译的话,逻辑操作被称为短路   代码可以绕过一个表达式的评估取决于   另一种表达的结果。如果是第一个表达式的结果   evaluate评估确定操作的最终结果,没有   需要评估第二个表达

另一方面,

And将评估导致此异常的两个表达式:

  

Boolean比较中,And运算符始终评估两者   表达式

您还可以使用将NothingDbNull视为空字符串的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")

如果resultDataRow类型的项目,则建议使用扩展方法将值转换为正确的类型

Dim value As Integer = datarow.Field(Of Integer)("IntegerColumnName")
Dim value As String = datarow.Field(Of String)("StringColumnName")
如果值为DataRow

DbNull将返回空字符串