非常(非常)经常我们需要写这样的东西
Dim Data = GetSomeData()
If Data IsNot Nothing Then
Data.DoSomething()
Else
...
End If
也许我的要求是徒劳的,但我真的希望 VB.Net 有一些类似的结构:
IfExists Data = GetSomeData() Then
Data.DoSomething()
Else
...
End IfExists
在我的梦中,它做了两件重要的事情:
- 没有额外的行来进行Nothing 检查
- 变量 A 在 block 之外不可见,因此以后不能被错误使用(就像“Using”或“With”一样)
还有什么类似的东西我还没有找到吗?
谢谢!
编辑: 受到 Bjørn-Roger Kringsjå 的回答的启发,我想出了一些令我满意的东西(对 VB.Net 的缺陷感到谦卑):
<Extension()>
Public Sub IfExists(Of T)(This As T, DoIfNotNothing As Action(Of T), Optional DoIfNothing As Action = Nothing)
If This IsNot Nothing Then
DoIfNotNothing(This)
ElseIf DoIfNothing IsNot Nothing Then
DoIfNothing()
End If
End Sub
然后我可以这样调用它(其中 false 部分是可选的)
GetSomeData().IfExists(Sub(Data) Data.DoSomething())
或
GetSomeData().IfExists(Sub(Data) Data.DoSomething(), Sub() DoSomethingElse())
最佳答案
正如其他人所说和我所暗示的,这是不可能的。就像分享一个 3'rd
解决方案。这次我们将使用delegates .
- 没有额外的行来进行Nothing 检查
- 变量 A 在 block 之外不可见,因此以后不能被错误使用。
实现
Public Module Extensions
Public Sub IfExists(Of T)(testExpr As T, trueDlg As Action(Of T), falseDlg As Action)
If (Not testExpr Is Nothing) Then
trueDlg.DynamicInvoke(New Object(0) {testExpr})
Else
falseDlg.DynamicInvoke(New Object(-1) {})
End If
End Sub
End Module
使用
IfExists(GetSomeData(),
Sub(A As Object)
'We have something (A)
End Sub,
Sub()
'We have nothing
End Sub
)
较短:
IfExists(GetSomeData(), Sub(A As Object)
'We have something (A)
End Sub, Sub()
'We have nothing
End Sub)
或者,最短的版本:
IfExists(GetSomeData(), Sub(A As Object) Debug.WriteLine(A.ToString()), Sub() Debug.WriteLine("Nothing"))
关于vb.net - 带 Nothing 检查的变量声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25188667/