【问题标题】:Simplify coding trycast vb.net简化编码 trycast vb.net
【发布时间】:2015-05-20 06:45:13
【问题描述】:

假设我有一些模型如下:黑色、绿色、蓝色、红色。

我有一个接收对象的函数,我想尝试将对象转换为适当的模型。

现在我有这样的代码:

Public Sub SetData(ByVal obj As Object)
    If TryCast(obj, black) IsNot Nothing Then
        Dim m As Black = TryCast(obj, black)
        ......
    ElseIf TryCast(obj, green) IsNot Nothing Then
        Dim m As green = TryCast(obj, green)
        ......
    ElseIf TryCast(obj, blue) IsNot Nothing Then
        Dim m As blue = TryCast(obj, blue)
        ......
    ElseIf TryCast(obj, red) IsNot Nothing Then
        Dim m As red = TryCast(obj, red)
        ......
    Else
        ......
    End If
End Sub

似乎代码效率不高,并且消耗更多内存并使用更多 CPU 进行双重 trycast。如何简化这段代码,例如检查trycast但同时得到结果模型,而不需要双重trycast过程?

【问题讨论】:

  • 理想情况下,您的所有模型都应该继承自同一个基础并具有 MustOverride(或至少是 Overridable)方法,您可以调用该方法然后应用正确的逻辑 - 而不是而不是让这个方法尝试找出它处理的对象类型,然后在里面也有特定类型的代码。
  • 是的……好点……我想我需要再考虑一下设计……

标签: vb.net simplify simplification


【解决方案1】:

你可以使用 TypeOf 来知道你的对象是什么 Class。 示例

If TypeOf obj Is black Then
    Dim m As Black = TryCast(obj, black)
ElseIf TypeOf obj Is green Then
    Dim m As green = TryCast(obj, green)
ElseIf TypeOf obj Is blue Then
    Dim m As blue = TryCast(obj, blue)
ElseIf TypeOf obj Is red Then
    Dim m As red = TryCast(obj, red)
    ......
Else
    ......
End If

【讨论】:

  • 这应该更好..!谢谢。
  • 当您已经知道它是匹配类型(您可以从 ChildType 到 BaseType 的 DirectCast)时,它是否应该使用 DirectCast 而不是 TryCast 表现更好?请参阅此问题:stackoverflow.com/a/385727/2410892
【解决方案2】:

好吧,我会说TryCastTryCast 没有意义,所以这会更有效:

Public Sub SetData(ByVal obj As Object)

    Dim blk As black = TryCast(obj, black)
    Dim grn As green = TryCast(obj, green)

    If blk IsNot Nothing Then

    ElseIf grn IsNot Nothing Then
        ......
    ElseIf 

    End If
End Sub

但我怀疑你应该在这里使用基类或接口,然后你根本不需要转换它。

【讨论】:

  • 马特,你关于在这种情况下使用接口的观点是编程的一个方面,仍然让我感到困惑..虽然我知道你是对的..我可以厚脸皮问你吗用一个应用它的插图来扩展你的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多