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)