VB.NET是否像C#一样具有模式匹配?

问题描述

不久前C#添加一个不错的“模式匹配”功能,您可以在一个语句中检查对象的类型并将其强制转换为该类型:

object o = GetSomeObjectFromTheDatabase();
if (o is Person p)
{
    Console.WriteLine($"{p.Name} is {p.Age} years old.");
}

VB.NET是否具有类似的功能,还是像过去一样必须进行类型检查并进行两个单独的操作?

解决方法

正如我之前在自己的评论中指出的(和上一个答案中提到的Codexer一样),该功能不在VB中。

根据Microsoft(https://devblogs.microsoft.com/vbteam/visual-basic-support-planned-for-net-5-0/)的最新评论,似乎不太可能在不久的将来将该功能添加到该语言中。话虽这么说,该语言仍然具有非常丰富的功能,而对于日常开发而言,它却很少丢失。如果您正在考虑是否要在VB中进行进一步的开发,则应考虑开发资源的可用性(内部和外部),VB对项目的适用性以及当前的代码库。

,

很遗憾,VB没有注释中已经提到的模式匹配。一种选择是创建一个模块,这样我们就可以创建一个扩展,以便在需要键入match的任何东西上使用。

Imports System.Runtime.CompilerServices

Module Extensions

    <Extension()>
    Public Function IsPatternMatch(Of T)(MyObj As Object,ByRef outObj As T) As Boolean
        Dim isMatch As Boolean = TypeOf MyObj Is T
        outObj = If(isMatch,CType(MyObj,T),outObj)
        Return isMatch
    End Function

End Module

示例用法:

 Dim o As Object = Nothing
 Dim p As Person = Nothing

 o = GetSomeObjectFromTheDatabase()
 If o.IsPatternMatch(p) Then
    ' Do something with p now...
 End If
,

.TryCast可能就是您想要的。如果成功,它将进行分配,否则返回Nothing。为了测试,我只是注释掉了2条Return语句之一。请注意,如果返回Coffee,则基础类型为c

Private Function GetSomeObjectFromTheDatabase() As Object
    Dim dt = LoadCoffeeTable() 'Returns a DataTable
    Dim c = New Coffee(CInt(dt(0)(0)),dt(0)(1).ToString,dt(0)(2).ToString)
    'Return c
    Return "I am not a Coffee"
End Function

Private Sub Button1_Click(sender As Object,e As EventArgs) Handles Button1.Click
    Dim o As Object = GetSomeObjectFromTheDatabase()
    Dim p As Coffee = TryCast(o,Coffee)

    If p Is Nothing Then
        MessageBox.Show("Object is not a Coffee  " & o.ToString)
    Else
        MessageBox.Show(p.Name)
    End If
End Sub