所以我有这个代码:
foreach (var user in ServersHolder.Servers.Find(f => f.ID == 9999).Online.FindAll(g => g.LoginPhase == 3))
{
await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}
我已经看到人们使用
?.
的地方,我相信在出现如下所示的空返回的情况下,但在这种情况下下面的代码不起作用。
foreach (var user in ServersHolder.Servers?.Find(f => f.ID == 9999).Online?.FindAll(g => g.LoginPhase == 3))
{
await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}
有人可以解释一下吗?或者最好的做法是这样做:
if (ServersHolder.Servers.Exists(f => f.ID == 9999))
{
foreach (var user in ServersHolder.Servers.Find(f => f.ID == 9999).Online.FindAll(g => g.LoginPhase == 3))
{
await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}
}
在第二个代码部分中,您对
ServersHolder.Servers
执行空检查。
在最后一个代码部分中,您验证
ServersHolder.Servers
中是否存在任何匹配的记录。
两者都执行不同的验证。
总结您需要的验证和数据抓取逻辑:
ServersHolder.Servers
不为空。ID = 9999
中的 ServersHolder.Servers
验证记录是否存在。Online
属性不能为空。Online
属性中的所有记录。正如评论中提到的,由于您没有在
foreach
循环中处理 null 值,因此您将收到空引用异常(NRE)。如果链(带有 ?.
空检查运算符)返回 null
,您需要提供默认/空列表。
foreach (var user in ServersHolder.Servers
?.Find(f => f.ID == 9999)
?.Online
?.FindAll(g => g.LoginPhase == 3) ?? new List<OnlineModel>())
{
await trySendPacket(9999, user.GUID.ToString(), OpCode.SentNotifyUserLeft, "", 2);
}