繁体   English   中英

在ASP.NET Core中正确实现NRT

[英]Proper implementation NRT in ASP.NET Core

我对作为ASP.NET Core MVC中C#8.0的一部分的可为空的引用类型有一些疑问:

  1. 当存在带有字符串参数的动作( public IActionResult Index(string message) )时,如果未传递给动作,则参数仍可以为null。 该问题的官方解决方案是什么? 还需要检查null吗?

  2. 当存在简单的可变模型时,如何正确地将其修改为NRT? 例如Scott Allen( https://odetocode.com/blogs/scott/archive/2019/08/07/think-twice-before-returning-null.aspx )建议创建NullUser 这是正确的吗? Maybe<T>声音也不适合NRT。 可变和不可变模型的官方解决方案是什么?

     public class User { public int UserId { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public IEnumerable<Message> Messages { get; set; } } public class Message { public int MessageId { get; set; } public string Text { get; set; } } 
  3. 现在,当我想从集合中提取某些东西时(并检查null后),我经常使用FirstOrDefault 集合不是空的,但是可以为空,现在当要使用First会引发异常,这是一个不好的原因,这是一个操作,并且想要创建不正确的响应而无需尝试( https://softwareengineering.stackexchange.com/questions/387674/ c-8非空引用和try-pattern )并尝试捕获。 同样, Maybe<T>听起来不是解决方案。 这个问题的官方解决方案是什么?

我知道我不需要避免空值,但希望将其最小化并遵循NRT cuz,它的声音像未来的歌曲

您使这太困难了。 可空的引用类型只是编译器提示-一种更明确地了解您实际希望执行的代码片段的方式。 确实并没有改变任何事情。

例如,对于动作参数的情况。 如果您的string参数可以为null(不应该为null,但是可以为-这很重要),那么它应该为string? 代替。 动作参数几乎总是可选的,因此它们肯定可以为空。 唯一的例外是路径参数,因为除非路径参数中充满某些东西,否则您实际上不会执行此操作。 例如,假设它是通过查询字符串填充的,那么它肯定可以为null,您应该使用string? 那里。 如果要确保它不为null,则需要使用标准的null保护:

if (message == null)
    return BadRequest();

可变性也与此无关。 同样,您要做的只是明确说明引用是否可以为null。 这也适用于您的第三个问题。 查询始终有可能与数据库中的行不匹配,然后返回空值。 使用First不能确保返回实际值。 在这种情况下,它只会引发异常。 在这种情况下,您应该继续使用FirstOrDefault ,还是使用User? / Message? (或只是var ),然后像往常一样执行null检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM