缩短此IF声明

时间:2010-09-16 10:03:20

标签: .net vb.net refactoring

我不喜欢宽代码,尤其是当它强迫我滚动时。所以写了这个:

If _item.SubItems(pd.perioddate).Text = "N/A" Or _item.SubItems(pd.perioddate).Text = String.Empty Then
            dtpDeadlineforAP.Checked = False
End If

是否有一种不错的方式来减轻它,使它更优雅?

9 个答案:

答案 0 :(得分:5)

_item.SubItems(pd.perioddate).Text提取到局部变量中,例如

String text = _item.SubItems(pd.perioddate).Text

If text = "N/A" Or text = String.Empty Then
            dtpDeadlineforAP.Checked = False
End If

或者,您可能希望将整个检查提取到单独的方法中:

If isNotFilled(_item.SubItems(pd.perioddate)) Then
            dtpDeadlineforAP.Checked = False
End If

这将使代码更具可读性,并允许您重用检查逻辑。

答案 1 :(得分:1)

string obj = _item.SubItems(pd.perioddate).Text;

If obj = "N/A" Or obj = String.Empty Then
            dtpDeadlineforAP.Checked = False
End If

同时

在visual studio中启用Word Warp以停止滚动。

转到

工具 - >选项 - >文字编辑器 - >所有语言 - > Word Warp

别忘了启用“显示所有设置”

答案 2 :(得分:1)

With _item.SubItems(pd.perioddate)
    If .Text = "N/A" Or .Text = String.Empty Then
        dtpDeadlineforAP.Checked = False
    End If
End With

关于WITH的优点/罪恶的提示论点:)

答案 3 :(得分:1)

如果有多个字段可以包含N / A,我建议采用以下方法:

Dim invalidValues As String() = {"N/A", String.Empty}

If invalidValues.Contains(_item.SubItems(pd.perioddate).Text) Then
    dtpDeadlineforAP.Checked = False
End If

或者,如果只是滚动,可以使用VB行继续符_

If _item.SubItems(pd.perioddate).Text = "N/A" _
Or _item.SubItems(pd.perioddate).Text = String.Empty Then
    dtpDeadlineforAP.Checked = False
End If

顺便说一句:在这里,我建议OrElse而不是Or

答案 4 :(得分:1)

我们至少应该提到Select Case

Select Case _item.SubItems(pd.perioddate).Text     
  Case "N/A", "" 
    dtpDeadlineforAP.Checked = False 
End Select 

还考虑提取辅助函数

Function IsNotApplicable(ByVal s As String) As Boolean
  Return (s = "N/A") Or (s = "")
End Function

答案 5 :(得分:0)

Dim date as String = _item.SubItems(pd.perioddate).Text

If date = "N/A" Or date = String.Empty Then 
            dtpDeadlineforAP.Checked = False 
End If

答案 6 :(得分:0)

正如其他人建议的那样,您可以使用局部变量。您还可以使用line continuation字符_来缩短该行。

String period = _item.SubItems(pd.perioddate);

If period = "N/A" Or _
   period = String.Empty Then
        dtpDeadlineforAP.Checked = False
End If

答案 7 :(得分:0)

我会假设一个Helper Class或ExtensionMethod:

If StringIsNullOrEmptyOrNA(stringval) Then
     ...
End If


If stringval.IsNullOrEmptyOrNa() Then
     ....
End If


Public Function StringIsNullOrEmptyOrNA(ByVal input as String) as Boolean
    return String.IsNullOrEmpty(input) OrElse input.Equals("N/A")
End Function


<System.Runtime.CompilerServices.Extension()> 
Public Function IsNullOrEmptyOrNa(ByVal input As String)
    return String.IsNullOrEmpty(input) OrElse input.Equals("N/A")
End Sub

答案 8 :(得分:0)

我把它归结为3行和63列。我已使用较新的If construct替换了传统的If operator。该代码还将处理Text为空引用的情况,并使用OrElse运算符进行短路。如果你愿意宣布一些扩展方法,你可以把它简化为一条短线,但这与我的答案精神相冲突。

Dim tx = _item.SubItems(pd.perioddate).Text
Dim dtp = dtpDeadlineforAP
dtp.Checked = If(tx = "N/A" OrElse tx = "", False, dtp.Checked)