我有一个属性IList <IMyPlayer> Players {}
,每次召唤时都会与游戏服务器同步。我需要知道它是否会在for循环中限制计数时更新每个增量。我之所以担心玩家可能会在这个循环中离开游戏。
编辑这是一个单线程应用程序。
public static IList <IMyPlayer> Players
{
get
{
playersField.Clear(); //GetPlayers() just adds without overwriting so list must be cleared every time.
if (Debugging == false)
{
MyAPIGateway.Multiplayer.Players.GetPlayers (playersField); //everytime the project needs to see all players, this will update. Little heavier on performance but its polymorphic.
}
return playersField.AsReadOnly();
}
}
for (int i = 0; i < AttendanceManager.Players.Count; i++)
{
if (AttendanceManager.Players[i].SteamUserId == MyAPIGateway.Multiplayer.MyId)
{
//do stuff
}
}
答案 0 :(得分:1)
我肯定不会这样做。
每次使用您的属性时,它都会调用API。这对于表现来说会很糟糕。此外,即使您不认为您的财产会被多次调用也很容易。我能想到的一个例子是序列化,或者如果你使用它作为一个参数来说MVC或Web API控制器方法。
这就是通常所说的副作用,这是你想要不惜一切代价避免吸气的东西。
答案 1 :(得分:1)
我可以看到您的方法存在几个潜在问题:
for
循环foreach
只会调用一次getter,这与for
循环的行为方式不同。如果你想这样做,我会把它变成一个GetPlayers()
函数,让你更清楚你是创建某些东西作为方法的一部分,而不只是得到当前的财产的价值。如果客户希望每次都重新加载列表,那么查看代码会更加明显。
例如:
for (int i = 0; i < AttendanceManager.GetPlayers().Count; i++)
{
if (AttendanceManager.GetPlayers()[i].SteamUserId == MyAPIGateway.Multiplayer.MyId)
看起来比标准属性吸气剂更加狡猾。