当你知道id假设存在时,如下例所示,检查空值是否是好的做法?
var submission = _ctx.Submissions.FirstOrDefault(p => p.Id == id);
submission.Done = true;
_ctx.Submissions.Attach(submission);
_ctx.Entry(submission).State = EntityState.Modified;
_ctx.SaveChanges();
答案 0 :(得分:4)
如果id应该存在,则不检查null。事实上在这种情况下你应该像这样查询
_ctx.Submissions.Single(p => p.Id == id);
如果找不到该项,Single方法将抛出异常。另一方面,如果您正在构建WebAPI或具有特定的未找到页面,因为客户端发送了id(即可能由代码之外的内容导致),您可以使用SingleOrDefault,然后检查null并返回适当的HTTP状态代码或重定向到适当的页面。基本上,如果未经验证的数据导致null,则应检查并做出相应的响应。如果导致空值的参数是由代码生成的,则不应检查null,实际上查询的方式可能不会导致null,否则您只是在代码中覆盖错误。
这是我的观点,这是我个人经历的结果。请注意,不是每个人都同意这一点,我在一段时间之前发布在programmers.stackexchange.com上的问题的不同答案显而易见 - https://softwareengineering.stackexchange.com/questions/147480/should-one-check-for-null-if-he-does-not-expect-null
答案 1 :(得分:3)
如果您无法完全确定该对象从不不为空,则检查null
。
话虽如此,您正在使用FirstOrDefault()
。如果它没有在条件中找到任何内容,它将返回null
。
答案 2 :(得分:2)
如果你认为总是是一个对象,并且没有相关对象意味着程序中存在错误,那么你应该使用{{1}不是First
。这样做意味着如果您对此代码的一个假设最终被违反,您将被迅速,大声地通知,并尽可能接近问题的根源。
FirstOrDefault
,从而返回FirstOrDefault
值。如果你处于这个位置,如果查询实际上返回null
,或者你需要做什么以使程序正常运行,程序应该可以正常工作。
您要避免的是将自己置于程序(错误地)假设查询始终至少有一个项目的位置,但无论如何您都使用null
。在这里,您最终会得到NullReferenceExceptions,它可以进行额外的调试工作,以确定实际问题的位置(没有应该有项目的项目的查询)。
答案 3 :(得分:1)
对于弹性代码,您应该检查并处理以查看submission
是否为空。
答案 4 :(得分:0)
如果通过传递空值发生错误,则检查空值。您可以通过使用try catch块或使用if else块以任何方式检查它们。
您可以检查它,这样可以防止null
值可能发生的错误。
答案 5 :(得分:0)
FirstOrDefault
将您的意图记录为"我期待的结果可能不包含项目"。在这种情况下,您应该检查null
并执行一些合理的后备。那时抛出异常看起来很奇怪。
听起来在你的情况下,你不希望空结果,所以使用First
并在调用堆栈的某个地方处理异常甚至让默认的异常处理发生。