每次调用它时,属性是否安全更新其元素?

时间:2016-12-13 22:13:17

标签: c# properties

我有一个属性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
    }
}

2 个答案:

答案 0 :(得分:1)

我肯定不会这样做。

每次使用您的属性时,它都会调用API。这对于表现来说会很糟糕。此外,即使您不认为您的财产会被多次调用也很容易。我能想到的一个例子是序列化,或者如果你使用它作为一个参数来说MVC或Web API控制器方法。

这就是通常所说的副作用,这是你想要不惜一切代价避免吸气的东西。

答案 1 :(得分:1)

我可以看到您的方法存在几个潜在问题:

  • 您在循环播放项目时添加项目,但只能循环,直到达到原始计数。因此,for循环
  • 不会访问任何添加的项目
  • 你的吸气剂不仅仅是正常的&#34; getter,如果客户端不知道这可能意味着性能问题
  • 使用foreach只会调用一次getter,这与for循环的行为方式不同。

如果你想这样做,我会把它变成一个GetPlayers()函数,让你更清楚你是创建某些东西作为方法的一部分,而不只是得到当前的财产的价值。如果客户希望每次都重新加载列表,那么查看代码会更加明显。

例如:

for (int i = 0; i < AttendanceManager.GetPlayers().Count; i++)
{
    if (AttendanceManager.GetPlayers()[i].SteamUserId == MyAPIGateway.Multiplayer.MyId)

看起来比标准属性吸气剂更加狡猾。