缩短多余的 switch 语句

Posted

技术标签:

【中文标题】缩短多余的 switch 语句【英文标题】:Shorten redundant switch statements 【发布时间】:2022-01-17 16:50:39 【问题描述】:

我从一个解决方案中获得了这段代码,我在谷歌上搜索了一个关于意大利面条if..else 语句的问题。有没有办法完全缩短这个时间,或者有一种不同的方法来使代码至少更易于维护。

            switch (registerControl.Valid_FullName(student.Student_Name) == true)
            
                case true:
                    lblFullNameError.Visibility = Visibility.Hidden;
                    break;
                case false:
                    lblFullNameError.Visibility = Visibility.Visible;
                    break;
            

            switch (registerControl.Valid_Email(student.Student_Email) == true)
            
                case true:
                    lblEmailError.Visibility = Visibility.Hidden;
                    break;
                case false:
                    lblEmailError.Visibility = Visibility.Visible;
                    break;
            

            switch (registerControl.Valid_Course(student.Student_Course) == true)
            
                case true:
                    lblCourseError.Visibility = Visibility.Hidden;
                    break;
                case false:
                    lblCourseError.Visibility = Visibility.Visible;
                    break;
            

            switch (registerControl.Valid_Password(student.Student_Password) == true)
            
                case true:
                    lblPasswordError.Visibility = Visibility.Hidden;
                    break;
                case false:
                    lblPasswordError.Visibility = Visibility.Visible;
                    break;
            

            switch (registerControl.Confirm_Password(student.Student_Password, student.student_ConfirmPassword) == true)
            
                case true:
                    lblPasswordMatch.Visibility = Visibility.Hidden;
                    break;
                case false:
                    lblPasswordMatch.Visibility = Visibility.Visible;
                    break;
            

【问题讨论】:

lblFullNameError.Visibility = registerControl.Valid_FullName(student.Student_Name) ? Visibility.Hidden : Visibility.Visible ?使用基于真/假输入返回 Visibility.Visible 或 Visibility.Hidden 的函数。在 Xaml 中使用带有 ValueConverters 的 Binding 来获取可见值,.... 最好的方法是将值设置为视图模型中的属性,并通过 BooleanToVisibilityConverter 将它们绑定到 xaml 中的可见性属性。这将更易于维护。 【参考方案1】:

您可以使用ternary operatorswitch 语句转换为单行语句,

lblFullNameError.Visibility = registerControl.Valid_FullName(student.Student_Name)  
                  ? Visibility.Hidden : Visibility.Visible;

您可以对其余的开关块应用相同的逻辑。

【讨论】:

@TimSchmelter 我修好了。感谢您的观察。【参考方案2】:

除了用三元运算符替换switch语句(如Prasad的回答所示)之外,您还可以将逻辑封装成一个方法:

void ToggleError(bool isDataValid, Label errorLabel)

    errorLabel.Visibility = isDataValid ? Visibility.Hidden : Visibility.Visible;

并按如下方式使用:

ToggleError(registerControl.Valid_FullName(student.Student_Name), lblFullNameError);
ToggleError(registerControl.Valid_Email(student.Student_Email), lblEmailError);
...

这样,您不必在每一行都重复 Visibility.HiddenVisibility.Visible。它也更易于维护:如果您想更改显示错误消息的方式,您只需要修改一个方法。

【讨论】:

以上是关于缩短多余的 switch 语句的主要内容,如果未能解决你的问题,请参考以下文章

switch语句与for语句的区别,能举例说明吗?谢啦!

switch语句里不需要必须有break吗

switch语句的用法?

switch语句怎么用啊 具体啊!

switch case语句和if的区别

switch的用法