我不喜欢宽代码,特别是当它迫使我滚动。所以写了这个:缩短这个IF语句
If _item.SubItems(pd.perioddate).Text = "N/A" Or _item.SubItems(pd.perioddate).Text = String.Empty Then
dtpDeadlineforAP.Checked = False
End If
是否有一个体面的方式来减薄,使它更优雅?
我不喜欢宽代码,特别是当它迫使我滚动。所以写了这个:缩短这个IF语句
If _item.SubItems(pd.perioddate).Text = "N/A" Or _item.SubItems(pd.perioddate).Text = String.Empty Then
dtpDeadlineforAP.Checked = False
End If
是否有一个体面的方式来减薄,使它更优雅?
提取_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
这将使代码的可读性更强,让你重用检查逻辑。
string obj = _item.SubItems(pd.perioddate).Text;
If obj = "N/A" Or obj = String.Empty Then
dtpDeadlineforAP.Checked = False
End If
ALSO
启用Word经在Visual Studio停止不必滚动。
转到
工具 - >选项 - >编辑 - 文本>所有语言 - >字经
不要忘记开启 '显示所有设置'
Dim date as String = _item.SubItems(pd.perioddate).Text
If date = "N/A" Or date = String.Empty Then
dtpDeadlineforAP.Checked = False
End If
With _item.SubItems(pd.perioddate)
If .Text = "N/A" Or .Text = String.Empty Then
dtpDeadlineforAP.Checked = False
End If
End With
提示关于WITH的优点/弊端的论据:)
如果有多个字段可以包含N/A,我会uggest以下方法:
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
BTW:在这里,我建议OrElse
而不是Or
。
正如其他人所建议的那样,您可以使用局部变量。您还可以使用line continuation字符_
另外缩短该行。
String period = _item.SubItems(pd.perioddate);
If period = "N/A" Or _
period = String.Empty Then
dtpDeadlineforAP.Checked = False
End If
我会suppgest一个助手类或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
bear记住在VB.Net版本9.0(VS 2008)中引入了扩展方法。 OP没有提及他正在使用的VB.Net/VS的版本。 – Jazza 2010-09-16 10:46:14
这就是为什么我首先在两种方式中添加了示例;) – 2010-09-16 13:57:35
我们至少应该提到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
我得到它下降到3行和63列。我用新的If operator取代了传统的If construct。该代码还将处理Text
作为空引用的情况,并将使用OrElse
运算符进行短路。如果你愿意宣布一些扩展方法,你可以把它简化成一条短线,但这与我的答案的精神相冲突。
Dim tx = _item.SubItems(pd.perioddate).Text
Dim dtp = dtpDeadlineforAP
dtp.Checked = If(tx = "N/A" OrElse tx = "", False, dtp.Checked)
我认为我们仍然可以改进。 VB.Net将空引用字符串视为等于“”,因此整个第一行可以被删除。 – MarkJ 2010-09-16 19:49:31
@MarkJ:直到现在,我还没有意识到这一点。感谢您指出了这一点! – 2010-09-16 19:59:18
我会重新命名文本变量意味着什么,朦胧periodDate = _item.SubItems(pd.perioddate)。文本 – Iain 2010-09-16 11:14:30
我们还应该考虑选择案例,而不是引入一个局部变量? 'Select Case _item.SubItems(pd.perioddate).Text Case“N/A”,“”dtpDeadlineforAP.Checked = False End Select' – MarkJ 2010-09-16 11:29:51
@Iain,同意了,我找不到一个好名字 - 正在考虑'findSomeMeaningfulNameForThis'一分钟:-) – 2010-09-16 11:54:15