while(player.CloseMenu(menuType))
{
}
player.CloseMenu(menuType)
将关闭所选类型的一个菜单,如果该类型没有,则返回false。
可以使用这样的空循环来关闭给定类型的所有菜单吗?
答案 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());