非常(经常)我们需要写一些像
Dim Data = GetSomeData()
If Data IsNot Nothing Then
Data.DoSomething()
Else
...
End If
Run Code Online (Sandbox Code Playgroud)
也许我是在徒劳地问,但我非常希望VB.Net有一些结构如下:
IfExists Data = GetSomeData() Then
Data.DoSomething()
Else
...
End IfExists
Run Code Online (Sandbox Code Playgroud)
在我的梦中,它做了两件重要的事情:
有什么类似于我还没有发现的东西吗?
谢谢!
编辑:灵感来自Bjørn-RogerKringsjå的答案我想出了一些令我满意的东西(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
Run Code Online (Sandbox Code Playgroud)
然后我可以像这样调用它(假部分是可选的)
GetSomeData().IfExists(Sub(Data) Data.DoSomething())
Run Code Online (Sandbox Code Playgroud)
要么
GetSomeData().IfExists(Sub(Data) Data.DoSomething(), Sub() DoSomethingElse())
Run Code Online (Sandbox Code Playgroud)
正如其他人所说和我所暗示的,这是不可能的。只是想分享一个3'rd解决方案。这次我们将使用delegate。
执行
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
Run Code Online (Sandbox Code Playgroud)
用法
IfExists(GetSomeData(),
Sub(A As Object)
'We have something (A)
End Sub,
Sub()
'We have nothing
End Sub
)
Run Code Online (Sandbox Code Playgroud)
较短:
IfExists(GetSomeData(), Sub(A As Object)
'We have something (A)
End Sub, Sub()
'We have nothing
End Sub)
Run Code Online (Sandbox Code Playgroud)
或者,最短的版本:
IfExists(GetSomeData(), Sub(A As Object) Debug.WriteLine(A.ToString()), Sub() Debug.WriteLine("Nothing"))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
216 次 |
| 最近记录: |