vb.net - 带 Nothing 检查的变量声明

标签 vb.net

非常(非常)经常我们需要写这样的东西

Dim Data = GetSomeData()
If Data IsNot Nothing Then
  Data.DoSomething()
Else
  ...
End If

也许我的要求是徒劳的,但我真的希望 VB.Net 有一些类似的结构:

IfExists Data = GetSomeData() Then
  Data.DoSomething()
Else
  ...
End IfExists

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

  1. 没有额外的行来进行Nothing 检查
  2. 变量 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 .

  1. 没有额外的行来进行Nothing 检查
  2. 变量 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/

相关文章:

JQuery Mobile + ASP.NET - 按钮不触发

.net - Tesseract 的奇怪问题

c# - 如何获取windows用户名

javascript - 从代码隐藏 asp.net 调用 Javascript

c# - 使用 Interop 从 excel 获取最后一个非空列和行索引

vb.net - 循环遍历 VB.NET 中的 request.querystring

.net - 通过 .NET HTML5 流式传输 MP4 视频

javascript 和 VB.net 返回不正确的结果

vb.net - 重新打开窗体时声音不播放

mysql - 优化 ScreenWriter 的 SQL 结果