当前位置: 首页 > 知识库问答 >
问题:

C#可为空检查验证属性不为空

汪德寿
2023-03-14

我有一个复杂的对象我想检查是否有效。我有一个方法来检查它,但是C#可为空性检查不知道它们:

#nullable enable
...

bool IsValid(Thing? thing) 
{
    return thing?.foo != null && thing?.bar != null;
}

...

if(IsValid(thing)) 
{
   thing.foo.subProperty; // CS8602 warning: foo is possibly null here

有没有办法在这里应用类似TypeScript的类型门的东西?如果isvalid为true,那么我们知道thing.foo不是null,但是C#分析器看不到函数内部。如果我内联检查它可以,但我是复制粘贴代码,这是一个简单的例子。

是否有任何注释或模式,我可以有空性分析与更复杂的检查?

共有1个答案

高承望
2023-03-14

您可以像这样使用null-forgening运算符:

if (IsValid(thing))
{
    thing.foo!.subProperty;
}

正如@JeroenMostert所指出的,虽然它不能帮助您使用foo,但另一种选择是NotNullWhen属性。

编译器知道thing在这里不是null,但是foo可能仍然是null

bool IsValid([NotNullWhen(true)] Thing? thing)
{
    return thing?.foo != null && thing?.bar != null;
}

if (IsValid(thing))
{
    thing.foo;
}
 类似资料:
  • 我在Eclipse-JDT中使用@nonnull-checking,很高兴看到它理解并尊重Apache Commons validate的使用。在代码中表示: 没有第一行,第二行将在Eclipse中生成警告。我只能在“assert”应该得到尊重的情况下进行配置。但是在没有任何进一步通知的情况下,它也尊重validate#NotNull和objects#RequireNonNull。这很棒,但我想知

  • 如何在下面的查询生成器代码段中获得industries page属性有值的结果?(即,其值不是空字符串)

  • 问题内容: 如何检查字符串是否不为null也不为空? 问题答案: 那呢? 确保&&按此顺序使用的部分,因为如果的第一部分&&失败,java将不会继续评估第二部分,因此确保你不会从为null的情况下得到null指针异常。 请注意,仅从Java SE 1.6起可用。你必须检查以前的版本。 也要忽略空格: (由于可以简化为也可以测试其他空白) 包裹在一个方便的功能中: 成为:

  • 问题内容: 在Java代码中执行空检查时,如果您为空值抛出IllegalArgumentExceptions,那么您将使用哪种消息模板? 我们倾向于使用这样的东西 哪个更好:“ is null”或“ was null”,为什么? 对我来说,“是空的”感觉更自然。 问题答案: 由于由于失败的前提条件检查而引发,因此,我认为除了陈述事实以外,还应说明已违反的 要求 。 就是说,而不是说。 关于使用库进

  • 问题内容: 原谅我,我来自ac#背景! 我在Go中有以下结构。我们通过从文件中读取配置来填充此结构,效果很好。但是我试图找出一种方法来告诉结构中的某个特定属性(通过配置文件传递时是否为null)。如图所示,完全没有设置。 我为此奋斗了大约3个小时。我可以针对类型字符串等执行此操作,但无法找到针对所有类型的通用方法? 问题答案: 在执行过程中,值的默认值为其零值。您可能要使所有类型的指针成为指针(例

  • 问题内容: 在Objective-C中,当我有一个数组时 我想检查它是否不为空,我总是这样做: 这样一来,无需检查是否会因为这种情况将导致代码陷入错误,并且非空数组也会这样做。 但是,在Swift中,我偶然发现了一个可选数组: 而且我无法确定要使用哪种条件。我有一些选择,例如: 选项A:在相同条件下检查非用例和空用例: 选项B: 使用解除绑定数组: 选项C: 使用Swift提供的合并运算符: 我不