2013-05-08 31 views
4

我知道VB中没有直接的函数多任务分配方式,但是我的解决方案是 - 它是否好,你会如何做得更好?具有多输出功能的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) 
+0

当'nA'已经是'Integer'时,没有理由使用'CInt(nA)'。 – mbomb007 2017-09-06 18:35:13

回答

1

对于未来的读者,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 = HelperFunctions.ColorToHSV(clr) 
MsgBox(MyHSVColor.hue) 

注VB.NET如何创造公共财产名为hue从被调用函数的返回类型推断。智能感知也适用于这些成员。

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

5

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

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)  

如果你有很多的成绩来回报这是合乎逻辑去思考的一类,可以返回所需的全部值(Expecially如果这些值是不同的数据类型)

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 
+0

+1相配的想法。 – 2013-05-08 09:37:11

+0

和这样一个基本的用途是真的需要实例化一个类?也许'结构'就够了? – 2013-05-08 10:16:47

+0

与返回数组没有多大区别。但你是对的,只有两个参数和整数类型,你可以用你的解决方案或通过预期的结果通过参考。当你需要处理复杂的数据时,事情会变得更加复杂。这仅仅是一个例子(我承认,有点不太可能) – Steve 2013-05-08 10:21:41

1

你的方法使用是一个很好的方式,顺便说一下,您可以将所需的变量作为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 
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)

+0

我不喜欢它......元组似乎很重,我只需要两个整数。 +在'with'中调用子程序foo多少次,一次或两次? – 2013-05-08 10:14:49

+0

@智能基础设施:子程序只被调用一次。'用'代替'输出'声明。元组允许避免被认为不是很好的实践的byref参数。您可以在您的算法中使用.item1,.item2,从而避免FloorOfA,CeilOfA声明。 – IvanH 2013-05-08 11:07:10

+0

我喜欢使用Tuple,但我不会在这里使用“With”。添加一层嵌套,仅用于访问多个返回结果。我会将结果分配给本地变量。 Dim输出= foo(nA)/ Dim FloorOfA = Output.Item1'。像有问题的代码,但使用Tuple而不是数组。 – ToolmakerSteve 2013-12-09 22:02:53

相关问题