零合并运算符“??“未捕获作为外键的数据库空值
本文关键字:空值 数据库 运算符 合并 | 更新日期: 2023-09-27 18:30:50
我有一个简单的C#语句:
var code = container.thing.result.decode ?? "Unknown";
当数据库值为 null 时,这将引发"对象引用未设置为对象的实例"异常。它(到目前为止)可以完美地处理非空值。我尝试更明确,并用三元运算符重写了该行:
var outcome = container.thing.result.decode == null ? "Unknown" : container.thing.result.decode;
我得到了相同的结果,但有相同的例外(ReSharper 引导我回到更简单的 ?? 语句)。
我还读到??运算符仅适用于可为空的类型。我正在使用的字段不是可为空的类型,它是一个 nvarchar(100),也是一个查找表的外键。正如我上面所说,该语句适用于有效的非空值。
应用程序的ORM还有一个CODE值,用于创建CODE和DECODE对,看起来它应该映射到查找表。
但是我不知道如何处理空值。
谢谢!
编辑:感谢您的快速回复!我确实在发布几分钟后就弄清楚了我在哪里感到困惑。我认为把问题写出来有助于我描述问题。我更改了语句以检查引用查找表的实际字段是否为空:
var outcome = container.thing.database_code_field == null ? "Unknown" : container.thing.result.Decode;
这看起来像我想要的。再次感谢!
如果以下任何一项为 null,则会出现异常:
-
container
-
container.thing
-
container.thing.result
我们无法判断在您的情况下哪些值为 null,或者 null 是否为有效值。你应该解决这个问题,然后修复任何给你一个空值的东西,或者编写代码来处理这种情况。
您需要逐步执行整个成员层次结构。
例如,如果container
为 null,则无法访问container.thing
。如果container.thing
为空,则无法访问container.thing.results
等。
仅仅捕获最后一个成员为 null 的情况是不够的。
问题是 container
、 thing
或 result
是空的,而不是decode
的。 如果decode
为 null,则 ??
运算符将适当地设置字符串。
??
是一个函数,它接受一些可为空的值和一个非空值来替换它。 需要计算??
运算符的整个左侧才能将其传递到该函数中,如果前面提到的变量之一为 null,则甚至不会走那么远。