【发布时间】:2023-03-29 04:59:01
【问题描述】:
在 .NET 中,有 null 引用,它在任何地方都用于表示对象引用为空,然后是 DBNull,数据库驱动程序(以及其他少数驱动程序)使用它来表示。 ..几乎一样的事情。自然,这会造成很多混乱,并且必须大量执行转换例程等。
那么为什么最初的 .NET 作者决定做这个呢?对我来说这毫无意义。他们的文档也毫无意义:
DBNull 类表示一个不存在的值。例如,在数据库中,表的一行中的列可能不包含任何数据。也就是说,该列被认为根本不存在,而不仅仅是没有值。 DBNull 对象表示不存在的列。此外,COM 互操作使用 DBNull 类来区分指示不存在值的 VT_NULL 变体和指示未指定值的 VT_EMPTY 变体。
关于“列不存在”的废话是什么?存在一列,它只是没有特定行的值。如果它不存在,我会在尝试访问特定单元格时遇到异常,而不是DBNull!我可以理解区分VT_NULL 和VT_EMPTY 的必要性,但是为什么不创建一个COMEmpty 类呢?这将更适合整个 .NET 框架。
我错过了什么吗?谁能解释一下为什么DBNull 被发明出来以及它有助于解决什么问题?
【问题讨论】:
-
只是另一个数据点... Perl 语言中的 DBI(DataBase Interface)模块没有 DbNull 的概念。当数据库中的值为 NULL 时,DBI 将其表示为 Perl“undef”,它在 C# 中相当于 Perl 的“null”。所以 Perl 的立场是不需要特殊的“DbNull”概念,而且我还没有听说过任何 Perl 程序员希望他们拥有 DbNull。
-
我支持你,@JoelFan - 我也认为它没有真正的用途
-
除了下面的答案,@thomas-levesque 下面的评论非常重要:
DBNull早于 .NET 框架中引入真正的可空类型。他们的行为略有不同,所以DBNull不得不留下来(我很遗憾,但那是另一回事)。 -
我喜欢这个问题,但不得不说社区是不一致的。许多关于“为什么会这样?”的问题。被关闭为“不是一个问题”,特别是如果提问者允许自己解释为什么某事似乎没有意义。 (在将 WCF 服务公开为 Web 服务时,我尝试询问/抱怨缺乏对抽象类型的适当支持,但立即遭到拒绝!)
标签: .net history dbnull rationale