C# 重构开关语句
我有这个转换语句C# 重构开关语句,c#,switch-statement,C#,Switch Statement,我有这个转换语句 string status = "1"; switch (status) { case "1": Button1.Visible = true; Button2.Visible = true; Button3.Visible = true; Button4.Visible = true; Button5.Visible = true; Panel1.Visible = tru
string status = "1";
switch (status)
{
case "1":
Button1.Visible = true;
Button2.Visible = true;
Button3.Visible = true;
Button4.Visible = true;
Button5.Visible = true;
Panel1.Visible = true;
break;
case "2":
Button1.Visible = true;
Button2.Visible = true;
Button3.Visible = true;
Button4.Visible = true;
Button5.Visible = true;
Panel2.Visible = true;
break;
}
还有一些代码冗余。在这两种情况下,都会显示按钮1-5,面板会参考状态值
有没有办法缩短代码
我的方法是减少冗余但增加行数——有没有其他明显的方法我没有想到
string status = "1";
switch (status)
{
case "1":
case "2":
Button1.Visible = true;
Button2.Visible = true;
Button3.Visible = true;
Button4.Visible = true;
Button5.Visible = true;
break;
}
switch (status)
{
case "1":
Panel1.Visible = true;
break;
case "2":
Panel2.Visible = true;
break;
}
创建按钮可见性的方法:
private void SetButtonVisibility(bool show)
{
Button1.Visible = show;
Button2.Visible = show;
Button3.Visible = show;
Button4.Visible = show;
Button5.Visible = show;
}
然后在switch语句中调用此方法:
switch (status)
{
case "1":
SetButtonVisibility(true);
Panel1.Visible = true;
break;
case "2":
SetButtonVisibility(true);
Panel2.Visible = true;
break;
}
创建按钮可见性的方法:
private void SetButtonVisibility(bool show)
{
Button1.Visible = show;
Button2.Visible = show;
Button3.Visible = show;
Button4.Visible = show;
Button5.Visible = show;
}
然后在switch语句中调用此方法:
switch (status)
{
case "1":
SetButtonVisibility(true);
Panel1.Visible = true;
break;
case "2":
SetButtonVisibility(true);
Panel2.Visible = true;
break;
}
制作一个可以切换所有需要的东西的函数怎么样?如果您添加了某些内容,则您将仅编辑该功能,以保持交换机干净:
string status = "1";
switch (status)
{
case "1":
enableSomething(true);
break;
case "2":
enableSomething(false);
break;
}
然后:
enableSomething(bool switcher) {
switcher ? Panel2.Visible = true : Panel1.Visible = true;
Button1.Visible = true;
Button2.Visible = true;
Button3.Visible = true;
Button4.Visible = true;
Button5.Visible = true;
}
制作一个可以切换所有需要的东西的函数怎么样?如果您添加了某些内容,则您将仅编辑该功能,以保持交换机干净:
string status = "1";
switch (status)
{
case "1":
enableSomething(true);
break;
case "2":
enableSomething(false);
break;
}
然后:
enableSomething(bool switcher) {
switcher ? Panel2.Visible = true : Panel1.Visible = true;
Button1.Visible = true;
Button2.Visible = true;
Button3.Visible = true;
Button4.Visible = true;
Button5.Visible = true;
}
将按钮放入列表,并使用ForEach设置属性
var listButton = new List<Button> {button1, button2, ...}
switch (status)
{
case "1":
listButton.ForEach(b => b.Visible = true);
Panel1.Visible = true;
break;
case "2":
listButton.ForEach(b => b.Visible = true);
Panel2.Visible = true;
break;
}
将按钮放入列表,并使用ForEach设置属性
var listButton = new List<Button> {button1, button2, ...}
switch (status)
{
case "1":
listButton.ForEach(b => b.Visible = true);
Panel1.Visible = true;
break;
case "2":
listButton.ForEach(b => b.Visible = true);
Panel2.Visible = true;
break;
}
您可以创建新方法来处理按钮的可见性状态,如下所示:
private void ChangeButtonVisibility(bool Status)
{
Button1.Visible = Status;
Button2.Visible = Status;
Button3.Visible = Status;
Button4.Visible = Status;
Button5.Visible = Status;
Panel1.Visible = Status;
}
switch (status)
{
case "1":
ChangeButtonVisibility(true);
break;
case "2":
ChangeButtonVisibility(false);
break;
}
然后从switch语句调用具有适当值的方法,如下所示:
private void ChangeButtonVisibility(bool Status)
{
Button1.Visible = Status;
Button2.Visible = Status;
Button3.Visible = Status;
Button4.Visible = Status;
Button5.Visible = Status;
Panel1.Visible = Status;
}
switch (status)
{
case "1":
ChangeButtonVisibility(true);
break;
case "2":
ChangeButtonVisibility(false);
break;
}
您可以创建新方法来处理按钮的可见性状态,如下所示:
private void ChangeButtonVisibility(bool Status)
{
Button1.Visible = Status;
Button2.Visible = Status;
Button3.Visible = Status;
Button4.Visible = Status;
Button5.Visible = Status;
Panel1.Visible = Status;
}
switch (status)
{
case "1":
ChangeButtonVisibility(true);
break;
case "2":
ChangeButtonVisibility(false);
break;
}
然后从switch语句调用具有适当值的方法,如下所示:
private void ChangeButtonVisibility(bool Status)
{
Button1.Visible = Status;
Button2.Visible = Status;
Button3.Visible = Status;
Button4.Visible = Status;
Button5.Visible = Status;
Panel1.Visible = Status;
}
switch (status)
{
case "1":
ChangeButtonVisibility(true);
break;
case "2":
ChangeButtonVisibility(false);
break;
}
<> P>一个有趣的方法,你可以考虑去声明。< /P> 让我们创建一个类,我们将其称为State: 我们的想法是,在这个类中放入任何可以影响UI状态的内容。目前,我们只有Status属性 然后,创建一些行为方法,这些方法可以是lambdas;我们想要/需要的是它们通常是可重用的,并且能够满足以下要求: 然后,创建一个字典集合,我在下面称之为uiUpdates,并添加您想要的所有行为。请注意,这种设计允许您在每个控件上有多个裂缝-可能您希望基于状态和可见来影响字体,如果需要,您可以使用两种小方法来实现这一点,而不是使用一种方法来处理这两种情况 应在InitializeControl完成工作后立即填充此词典 注意:现在您可以使用一种方法:
private void AfterStateUpdated(State newState)
{
foreach(var kvp in uiUpdates)
{
var c = kvp.Key;
foreach(var update in kvp.Value)
{
update(newState,c);
}
}
}
当你的状态改变时,你就称之为。现在,您不必拥有gloryhole方法,只需知道如何基于所有可能的状态值更新所有UI状态
在上面的例子中,我假设表单字段中也有一个状态实例,但是我仍然更喜欢将状态显式地传递给操作方法,而不是让它们从表单中获取它。如果您希望有一个由多个表单使用的集中方法集,假设状态定义也适用于这种共享 ,那么这就增加了重用的机会。 让我们创建一个类,我们将其称为State: 我们的想法是,在这个类中放入任何可以影响UI状态的内容。目前,我们只有Status属性 然后,创建一些行为方法,这些方法可以是lambdas;我们想要/需要的是它们通常是可重用的,并且能够满足以下要求: 然后,创建一个字典集合,我在下面称之为uiUpdates,并添加您想要的所有行为。请注意,这种设计允许您在每个控件上有多个裂缝-可能您希望基于状态和可见来影响字体,如果需要,您可以使用两种小方法来实现这一点,而不是使用一种方法来处理这两种情况 应在InitializeControl完成工作后立即填充此词典 注意:现在您可以使用一种方法:
private void AfterStateUpdated(State newState)
{
foreach(var kvp in uiUpdates)
{
var c = kvp.Key;
foreach(var update in kvp.Value)
{
update(newState,c);
}
}
}
当你的状态改变时,你就称之为。现在,您不必拥有gloryhole方法,只需知道如何基于所有可能的状态值更新所有UI状态
在上面的例子中,我假设表单字段中也有一个状态实例,但是我仍然更喜欢将状态显式地传递给操作方法,而不是让它们从表单中获取它。如果您想让多个表单使用一组中心方法(假设状态定义也适用于此类共享),这将增加重用的机会当然:提取在这两种情况下都调用的方法。为控件选择更好的名称。另外,如果你想索引到你的面板集合中,为什么不把它们放在一个列表中呢?@Damien_The_Unsivers这只是一个示例代码来澄清我的问题是故意的,你在任何情况下都不会将任何面板设置为不可见的?当然:通过提取在两种情况下都调用的方法。为你的控件选择更好的名称。而且,如果你想索引到你的面板集合中,为什么不把它们放在一个列表中呢?@Damien_The_unsiver这只是一个示例代码来澄清我的问题是故意的,你在任何情况下都不会设置任何面板不可见?在ori中
ginal代码示例,Panel 1随案例1而更改,Panel 2随案例2而更改,因此您需要删除Panel 1。从ChangeButtonVisibility方法中可见,并将其添加为案例中的第二行。是的,我只是解释了它本身不提供完整解决方案的想法。感谢您的提示。在原始代码示例中,面板1随案例1而更改,面板2随案例2而更改,因此您需要删除面板1。从ChangeButtonVisibility方法中可见,并将其添加为案例中的第二行。是的,我只是解释了它本身并没有提供完整解决方案的想法。谢谢你的提示。