正在使用的时候这个好吗?

时间:2011-04-11 23:33:45

标签: c#

        while(player.CloseMenu(menuType))
        {
        }

player.CloseMenu(menuType)将关闭所选类型的一个菜单,如果该类型没有,则返回false。

可以使用这样的空循环来关闭给定类型的所有菜单吗?

6 个答案:

答案 0 :(得分:3)

在提出巧妙的代码处理方法时要小心。它可能会在短期内节省一些击键次数,但总有一天其他人可能会看到这个代码并且想知道:

  • 这甚至在做什么?
  • 好的,我看到它在做什么,但为什么这样做呢?
  • 这是否有令人信服的理由,我应该避免它以免破坏别的东西吗?

请记住,在您忘记此代码的详细信息后的几个月内,其他人可能就是您。

保存几行代码并不是什么大问题。任何只需要写一次的东西都是有限的工作量。任何在未来支持中产生混乱的事情都会产生一种未知的,不那么有限的工作量。

答案 1 :(得分:2)

如果其他人需要阅读,我会使用更多自我文档。

问题在于你必须推断调用被推断为bool才能理解。

也许你将它命名为player.IsMoreAfterClose()。

while(true)
{
   bool b = player.CloseMenu(menuType);
   if(!b) break;
}

bool b = true;
while(b)
{
  b = player.CloseMenu(menuType);
}

答案 2 :(得分:1)

显然,它会起作用,但它会使代码难以阅读/维护。你可能会更好,循环条件是检查任何打开的菜单,循环体关闭一个。

答案 3 :(得分:1)

我会扩展所有这些答案并创建一个名为CloseAllMenus(MenuType menuType)的方法。然后你可以在那里放置任何类型的丑陋实现,并且当你调用它时它将会显而易见。您当前的代码不会解释究竟发生了什么,除非您已经知道可以打开特定类型的多个菜单,并且此调用只会关闭其中一个。

答案 4 :(得分:0)

可以这样做,因为它意味着do something until certain condition is met。但最好将其合并到CloseMenu函数中,这样您就不必多次重复此指令,实际上它是关闭菜单的一种变体,您要关闭所有菜单。您可以向函数添加一个布尔参数,以指示是否要关闭所有菜单。

bool CloseMenu(type, closeAll){
   if(closeAll)
      while(exists(type))
      { close...
   else
      if(exists(type)
      { close...
}

答案 5 :(得分:0)

也许正确的事情是从没有身体的While / Close转换为For / Open并且身体正在执行关闭操作。

foreach(var menu in player.OpenMenus)
  menu.Close();

或:

player.OpenMenus.ForEach(c => c.Close());