今天我偶然发现了VB.net If()语句的奇怪行为.也许你可以解释为什么它像它一样工作,或者你可以确认它是一个bug.
所以,我有一个带有"TestTable"表的SQL数据库,其中一个int列"NullableColumn"可以包含NULL.我想宣读本专栏的内容.
所以我声明了一个类型的变量Nullable(Of Integer),打开一个SqlClient.SqlDataReader"SELECT NullableColumn FROM TestTable"并使用以下代码来获取该列的内容:
Dim content as Nullable(Of Integer)
...
Using reader as SqlClient.SqlDataReader = ...
content = If(reader.IsDBNull(reader.GetOrdinal("NullableColumn")), Nothing, reader.GetInt32(reader.GetOrdinal("NullableColumn")))
End Using
Run Code Online (Sandbox Code Playgroud)
但在那之后,我的变量content的值为0,而不是Nothing我预期的那样.
调试时一切看起来都不错,所以
reader.GetOrdinal("NullableColumn") 提供此列的正确序号位置(为0)reader.IsDBNull(0)并且reader.IsDBNull(reader.GetOrdinal("NullableColumn"))传递True,因为此列的内容确实是NULLIf(1=2, Nothing, "Not Nothing") 提供字符串"没什么"If(1=1, Nothing, "Not Nothing") 提供 Nothingreader.GetInt32(reader.GetOrdinal("NullableColumn")) 抛出错误,因为NULL无法转换为 Integer那么,为什么我的变量的值为0?
在VB中,Nothing与null不同.If运算符必须根据传递给它的参数确定其结果的类型.当然,没有任何类型,因此If运算符可以在代码中返回的唯一类型是Int32.如果IsDBNull方法返回true,则If运算符返回Nothing强制转换为Int32.在VB中,Nothing返回类型的默认值.对于Int32,默认值为0.
从MSDN上的Nothing关键字:
Nothing represents the default value of a data type. The default value depends
on whether the variable is of a value type or of a reference type.
For non-nullable value types, Nothing in Visual Basic differs from null in C#.
In Visual Basic, if you set a variable of a non-nullable value type to Nothing,
the variable is set to the default value for its declared type. In C#, if you
assign a variable of a non-nullable value type to null, a compile-time error
occurs.
Run Code Online (Sandbox Code Playgroud)
我认为只是一个普通的If会效果最好:
If Not reader.IsDBNull(reader.GetOrdinal("NullableColumn")) Then
content = reader.GetInt32(reader.GetOrdinal("NullableColumn"))
End If
Run Code Online (Sandbox Code Playgroud)
或者保持更短
If Not reader.IsDBNull(reader.GetOrdinal("NullableColumn")) Then content = reader.GetInt32(reader.GetOrdinal("NullableColumn"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |