可能的NullReferenceException ReSharper代码分析C#
Possible NullReferenceException ReSharper code analysis C#
ReSharper 代码分析告诉我,在下面的代码片段中
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;}
}
如果你确定你的 collection 中有这样的元素,那么你可以使用 .First
:
if (users.Select(a => a.id).Contains(user_id))
{
return users.First(a => a.id == user_id).type == 2;
}
但是,最好使用 .FirstOrDefault
和 null 检查而不是 Contains
,这样您就不会查找 collection 两次:
var foundItem = users.FirstOrDefault(x => x.id == user_id);
if (foundItem != null)
{
return foundItem.type == 2;
}
Is this true given that I already check whether this specific user_id
exists in the users
container?
是的,这是警告是正确的,因为 users
可能会在对 Contains
的调用和对 FirstOrDefault
的调用之间同时更改。 ReSharper 的逻辑分析器不假定独占访问容器,因此发出警告是正确的行为。
您可以使用空条件运算符修复此警告:
var optType = users.FirstOrDefault(a => a.id == user_id)?.type;
if (optType.HasValue) {
return optType == 2;
}
ReSharper 代码分析告诉我,在下面的代码片段中
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;}
}
如果你确定你的 collection 中有这样的元素,那么你可以使用 .First
:
if (users.Select(a => a.id).Contains(user_id))
{
return users.First(a => a.id == user_id).type == 2;
}
但是,最好使用 .FirstOrDefault
和 null 检查而不是 Contains
,这样您就不会查找 collection 两次:
var foundItem = users.FirstOrDefault(x => x.id == user_id);
if (foundItem != null)
{
return foundItem.type == 2;
}
Is this true given that I already check whether this specific
user_id
exists in theusers
container?
是的,这是警告是正确的,因为 users
可能会在对 Contains
的调用和对 FirstOrDefault
的调用之间同时更改。 ReSharper 的逻辑分析器不假定独占访问容器,因此发出警告是正确的行为。
您可以使用空条件运算符修复此警告:
var optType = users.FirstOrDefault(a => a.id == user_id)?.type;
if (optType.HasValue) {
return optType == 2;
}