【问题标题】:Possible NullReferenceException ReSharper code analysis C#可能的 NullReferenceException ReSharper 代码分析 C#
【发布时间】:2017-11-08 11:50:37
【问题描述】:

ReSharper 代码分析告诉我,在下面的代码 sn-p

if (users.Select(a => a.id).Contains(user_id))
{
    return users.FirstOrDefault(a => a.id == user_id).type == 2;
}

return users.FirstOrDefault(a => a.id == user_id).type 行可能导致System.NullReferenceException。鉴于我已经检查了这个特定的user_id 是否存在于users 容器中,这是真的吗?

class users
{
   int id {get; set;}
   int other_stuff {get; set;}
}

【问题讨论】:

    标签: c# resharper


    【解决方案1】:

    如果你确定你的收藏中有这样的元素,那么你可以使用.First

    if (users.Select(a => a.id).Contains(user_id))
    {
         return users.First(a => a.id == user_id).type == 2;
    }
    

    但是,最好使用.FirstOrDefault 和空检查而不是Contains,这样您就不会查找您的集合两次:

    var foundItem = users.FirstOrDefault(x => x.id == user_id);
    if (foundItem != null)
    {
        return foundItem.type == 2;
    }
    

    【讨论】:

      【解决方案2】:

      鉴于我已经检查了这个特定的user_id 是否存在于users 容器中,这是真的吗?

      是的,这是正确的警告,因为users 可能会在调用Contains 和调用FirstOrDefault 之间同时更改。 ReSharper 的逻辑分析器不假定对容器的独占访问,因此发出警告是正确的行为。

      您可以使用空条件运算符修复此警告:

      var optType = users.FirstOrDefault(a => a.id == user_id)?.type;
      
      if (optType.HasValue) {
          return optType == 2;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-20
        相关资源
        最近更新 更多