Vb.net 具有多个输出的VB函数-结果赋值

Vb.net 具有多个输出的VB函数-结果赋值,vb.net,function,variable-assignment,mass-assignment,Vb.net,Function,Variable Assignment,Mass Assignment,我知道在VB中没有简单的方法可以多次赋值函数,但我有一个解决方案——好吗,你会如何做得更好 我需要什么(我将如何在python中实现它,只是一个示例) 如何在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() = fo

我知道在
VB
中没有简单的方法可以多次赋值函数,但我有一个解决方案——好吗,你会如何做得更好

我需要什么(我将如何在python中实现它,只是一个示例)

如何在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)

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

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)    
如果有许多结果要返回,那么考虑一个可以返回所有所需值的类是合乎逻辑的(特别是如果这些值属于不同的数据类型)


您使用的方法很好,顺便说一句,您可以将所需的变量作为
引用
传递给
子例程
,以使
代码更清晰

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
也许你可以使用:


编辑:用元组替换新元组。创建(感谢@mbomb007)

对于未来的读者,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对这些成员也能正常工作


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

不知何故,我不喜欢它。。。元组似乎很重,我只需要两个整数使用
中调用子例程foo的次数,一次或两次?@Intelligent Infrastructure:子例程只调用一次用“替换”输出“声明。元组允许避免byref参数,这被认为不是很好的实践。您可以在agorithm中使用.item1、.item2,从而避免使用FloorOfA、CeilOfA声明。我喜欢使用Tuple,但这里不使用“With”。添加嵌套级别,仅用于访问多个返回结果。我会将结果分配给一个本地变量。
Dim Output=foo(nA)/Dim FloorOfA=Output.Item1
。类似于所讨论的代码,但使用元组而不是数组。@ToolmakerSteve:“With”用于避免变量声明的必要性。特别是在未使用选项推断且需要完整声明
Dim输出为元组(整型,整型)=foo(nA)
的情况下。我承认这是个人品味的问题。@IvanH这就是
Tuple.Create()
的目的,所以您不必使用如此冗长的声明。而对于这样一个基本的用途,真的需要实例化一个类吗?也许
结构
就足够了?它与返回数组没有太大区别。但是你是对的,只有两个参数和整数类型,你可以使用你的解决方案或通过Ref传递预期的结果。当你需要处理复杂的数据时,事情会变得更加复杂。这只是一个例子(我承认,有点不太可能),是的,一个结构也会很好地工作。你会得到一些东西,但这实际上取决于你调用此方法的次数。当
nA
已经是
整数时,没有理由使用
CInt(nA)
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
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)