带Nothing检查的变量声明

Maj*_*jnu 5 vb.net

非常(经常)我们需要写一些像

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)

在我的梦中,它做了两件重要的事情:

  1. 没有额外的行没有检查
  2. 变量A在块外部不可见,因此以后不能错误地使用(就像"使用"或"使用"一样)

有什么类似于我还没有发现的东西吗?

谢谢!

编辑:灵感来自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)

Bjø*_*sjå 4

正如其他人所说和我所暗示的,这是不可能的。只是想分享一个3'rd解决方案。这次我们将使用delegate

  1. Nothing 检查无需额外行
  2. 变量 A 在块之外不可见,因此以后不能被错误使用。

执行

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)