2016-12-13 53 views
-1

我有一个财产,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

如果你正在使用多线程,'''''''''''''''''锁''会阻止那个 – NtFreX

+0

嗨,这是一个单线程应用程序。 –

+0

@ Dr.Fre和Samuel:在最后一个循环中,即使Players.Count被缓存,那么这一行:'AttendanceManager.Players [i] .SteamUserId'将在每个循环迭代中调用getter,它将调用清除,GetPlayers和AsReadOnly每次迭代。这是一个非常糟糕的主意。通常。 – quetzalcoatl

回答

1

我可以看到你的方法有几个潜在的问题:

  • 添加内容,而你是遍历它,但只循环,直到达到计数。因此,任何添加的项目不被for
  • 你消气剂做的比“正常”吸气剂更多,这可能意味着性能的问题,如果客户没有意识到使用foreach只会叫吸气一旦
  • 访问,这会表现出与您的for循环不同的行为。

如果你想做到这一点,我反而使它成为一个GetPlayers()功能,这使得它更清楚,你是创建东西作为方法的一部分,而不仅仅是得到一个属性的当前值。如果客户希望在每次他们没有这样做的时候重新加载列表,但是看代码会更明显。

例如:

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

看起来比一个标准的属性获取更狡猾。

1

我绝对不会这样做。

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

这就是通常所说的副作用,这是你不惜一切代价在吸气剂中避免的。

相关问题