gpt4 book ai didi

c# - 如果方法完全返回,请指定 NotNull

转载 作者:行者123 更新时间:2023-11-30 16:37:26 27 4
gpt4 key购买 nike

我正在使用 C# 8 中新的可空引用类型,我想知道如果方法完全返回,是否可以指示传入的参数不为空。

我找到了 [NotNullIf][DoesNotReturnIf] 但它们似乎触发了方法的返回值和特定的 bool 参数分别。

这是我目前拥有的:

public static bool RaiseIfNull([NotNullWhen(true)] object? thing) => RaiseIf(() => thing is null);
public static bool RaiseIf(Func<bool> predicate)
{
if (predicate()) throw new HttpException(400);
return true;
}

这看起来不错,但是当我调用它时 - 我仍然会看到警告。 (我还尝试了 RaiseIfNull([NotNullIfNotNull("thing")] object?thing) 但这没有用。)

[HttpPost("{id}")]
public async Task Etc(string id, [FromBody] Dto data)
{
HttpException.RaiseIfNull(data?.property);
await DoEtc(id, data.property)); // warning here
}

我是否漏掉了一些明显的东西?

最佳答案

使用正常的 null 检查

首先,RaiseIfNull不提供更多的东西:

var value=data?.property ?? new HttpException(400);

编译器可以识别的。 RaiseIfNull另一方面隐藏了实际发生的事情。此代码不会产生警告:

class D
{
public string? property{get;set;}
}


D? data=null;
var value=data?.property ?? throw new HttpException(400);
Console.WriteLine(value.Length);

无条件后置条件和泛型

也就是说,要使用的正确参数是 NotNull - 方法执行后,即使类型本身可以为空,参数也不为空。该属性可以应用于:

  • 参数
  • 属性
  • 字段和
  • 返回值

这些方法也可以是通用的,以避免将结构装箱到对象中。为此,我们需要指定类型是类还是结构,因为生成的具体类型非常不同 - string?仍然是一个字符串,而 int?Nullable<int> :

public static bool RaiseIfNull<T>([NotNull] T? thing) 
where T:class
=> RaiseIf(() => thing is null);

public static bool RaiseIfNull<T>([NotNull] T? thing)
where T:struct
=> RaiseIf(() => thing is null);

鉴于这些方法,以下代码也不会生成警告:

D? data=null;
RaiseIfNull(data?.property);
Console.WriteLine(data.property.Length);

最后,我们可以去掉返回值:

public static void RaiseIfNull<T>([NotNull] T? thing) 
where T:class
=> RaiseIf(() => thing is null);

public static void RaiseIfNull<T>([NotNull] T? thing)
where T:struct
=> RaiseIf(() => thing is null);

关于c# - 如果方法完全返回,请指定 NotNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58279704/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com