【问题标题】:VB.NET generic function for checking for a value of null用于检查 null 值的 VB.NET 通用函数
【发布时间】:2010-08-25 04:19:45
【问题描述】:

我正在尝试编写一个通用函数,它将检查每个数据库参数以查看它是否为空,如果是,则返回 DBNull;如果不是,则返回该对象。

这是我的功能:

Public Shared Function CheckForNull(ByVal obj As Object) As Object
    If obj <> Nothing Then Return obj Else Return DBNull.Value
End Function

我的问题是我传递给函数的一些对象是可空的。所以我可以通过函数 Long?或 Int?,但是当一个可为空的类型传递给函数时,它被转换为它的值类型。那么如果我通过一个 Long 呢?如果值为 0,则该函数返回 DBNull,因为 Long?转换为 Long 并且 Long 的值为 0 相当于 Nothing。有没有办法让这个函数也适用于 Nullable 类型?

如果没有,我将只使用以下语句而不是一个通用函数调用:

IIf(nullableVar.HasValue, nullableVar, DBNull.Value))

和

IIf(nonNullableVar IsNot Nothing , nonNullableVar, DBNull.Value))

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    这不是你的逻辑失败的原因。当评估像 (x=y) 或 (xy) 这样的表达式时,如果任一参数为 Nothing,VB.Net 将返回 FALSE。您的条件总是落入 ELSE 子句。所以而不是:

    if obj <> Nothing then
    

    试试这个:

    if obj isnot nothing then
    

    【讨论】:

    • 感谢您的回复。作为必须编写 VB.NET 的 C# 开发人员,我仍在努力正确处理“无”。将 '' 更改为 'IsNot' 可以解决问题。但是,我的答案有一个问题,我的原始评估“obj Nothing”适用于所有情况,除非将值为零的可空值类型与空值进行比较。当我将一个字符串传递给函数时,函数会正确返回字符串。
    • 是不是''运算符将一个可为空的值类型转换回一个普通的值类型,这就是为什么当值类型的值为0时比较失败并返回DBNull?
    • 可能正在进行一些隐式转换。 M$ 喜欢“帮助”我们这些懦弱的 VB 程序员。我总是将 Option Strict On 作为任何代码文件的第一行,以防止这种意外行为。
    • 谢谢。不知道“Option Strict On”(刚刚接手了一个旧的 VB.NET 项目;我仍在努力了解 C# 和 VB.NET 之间的差异)。为项目打开它; 3 小时和大约 1000 个错误之后...不再有隐式转换,希望不再有意外行为。
    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多