14

我知道对 in 中的函数进行多重分配没有直接的方法VB,但是有我的解决方案 - 好不好,你会如何做得更好?

我需要什么(我将如何在 python 中做到这一点,只是一个例子)

def foo(a)    ' function with multiple output
    return int(a), int(a)+1

FloorOfA, CeilOfA = foo(a) 'now the assignment of results

我如何在VB中做到这一点:

Public Function foo(ByVal nA As Integer) As Integer() ' function with multiple output
    Return {CInt(nA),CInt(nA)+1}
End Function

Dim Output As Integer() = foo(nA) 'now the assignment of results
Dim FloorOfA As Integer = Output(0)
Dim CeilOfA As Integer = Output(1)
4

4 回答 4

16

对于未来的读者,VB.NET 2017 及更高版本现在支持将值元组作为语言功能。你声明你的函数如下:

Function ColorToHSV(clr As System.Drawing.Color) As (hue As Double, saturation As Double, value As Double)
  Dim max As Integer = Math.Max(clr.R, Math.Max(clr.G, clr.B))
  Dim min As Integer = Math.Min(clr.R, Math.Min(clr.G, clr.B))

  Dim h = clr.GetHue()
  Dim s = If((max = 0), 0, 1.0 - (1.0 * min / max))
  Dim v = max / 255.0

  Return (h, s, v)
End Function

你这样称呼它:

Dim MyHSVColor = ColorToHSV(clr)
MsgBox(MyHSVColor.hue)

请注意 VB.NET 如何创建名为hue从被调用函数的返回类型推断的公共属性。Intellisense 也适用于这些成员。

但是请注意,您需要以 .NET Framework 4.7 为目标才能使其正常工作。或者,您可以System.ValueTuple在项目中安装(作为 NuGet 包提供)以利用此功能。

于 2017-11-28T15:11:09.423 回答
10

您的解决方案有效,它是返回多个结果的一种优雅方式,但是您也可以尝试使用它

Public Sub foo2(ByVal nA As Integer, ByRef a1 As Integer, ByRef a2 As Integer) 
    a1 = Convert.ToInt32(nA)
    a2 = Convert.ToInt32(nA) +1
End Sub

并打电话给

foo2(nA, CeilOfA, FloorOfA)    

如果您有许多结果要返回,那么考虑一个可以返回所有所需值的类是合乎逻辑的(特别是如果这些值具有不同的数据类型)

Public Class CalcParams
   Public p1 As Integer
   Public p2 As String
   Public p3 As DateTime
   Public p4 As List(Of String)
End Class

Public Function foo2(ByVal nA As Integer) As CalcParams
    Dim cp = new CalcParams()
    cp.p1 = Convert.ToInt32(nA)
    .......
    Return cp
End Function
于 2013-05-08T09:30:32.673 回答
3

也许你可以使用Tuple

Public Function foo(ByVal nA As Integer) As Tuple(Of Integer,Integer) ' function with multiple output
    Return Tuple.Create(CInt(nA),CInt(nA)+1)
End Function

Dim FloorOfA, CeilOfA As Integer
With foo(nA) 'now the assignment of results
   FloorOfA =.item1
   CeilOfA = .item2
End With

编辑:用 Tuple.Create 替换新的元组(感谢 @mbomb007)

于 2013-05-08T09:59:52.577 回答
3

您使用的方法是一个很好的方法,顺便说一下,您可以将所需的变量作为 a 传递reference给您的方法,subroutine以使您code更清洁。

Dim FloorOfA As Integer
Dim CeilOfA As Integer

Call foo(10.5, FloorOfA, CeilOfA)

Public Sub foo(ByVal xVal As Integer, ByRef x As Integer, ByRef y As Integer)
    x = CInt(xVal)
    y = CInt(xVal) + 1
End Sub
于 2013-05-08T09:33:41.510 回答