在 Visual Basic 中从结构中的函数返回值
Returning values from functions in structures in Visual Basic
希望 post 的标题不要太乱。我正在复习上周的一些课程 material,关于这个特殊结构和其中的加减函数,只有一件事我不明白:
Structure ComNum
Dim Re As Double
Dim Im As Double
Function add(ByVal br As ComNum) As ComNum
add.Re = br.Re + Re
add.Im = br.Im + Im
End Function
Function subt(ByVal br As ComNum) As ComNum
subt.Re = br.Re - Re
subt.Im = br.Im - Im
End Function
End Structure
Sub Main()
Dim a, b, c As ComNum
a.Re = 2
a.Im = 3
b.Re = 4
b.Im = 5
c = a.add(b).add(b).subt(b)
Console.WriteLine("The second number added twice and subtracted once from the first number gives {0}+{1}i", c.Re, c.Im)
End Sub
现在,我对函数的理解是,一旦从函数返回任何内容,函数的执行就会在返回值的那一行停止,执行后什么也不会执行。据此,它应该添加实部并退出函数。
我知道我遗漏了一个关键的东西,如果有人能向我解释一下,我将不胜感激。
您设置这些函数的方式是在您每次调用它们时创建一个新的空 ComNum 结构(根据函数名称命名为 add 或 subt)。除非你提前手动 return 它们,否则它将默认为 return 命名结构的函数。
Function add(ByVal br As ComNum) As ComNum
add.Re = br.Re + Re
add.Im = br.Im + Im
End Function
基本上相当于:
Dim add As New ComNum
add.Re = br.Re + Re
add.Im = br.Im + Im
Return add
尽管像 Lars 指出的那样,我不确定您为什么希望它是函数而不是子函数。现在按照您设置的方式使用它需要您执行类似这样的操作来获取 add/subtract 值,因为您需要捕获 returned ComNum 对象。
Dim a As New ComNum With {.Im = 1, .Re = 1}
'Im = 6, Re = 6
a = a.add(New ComNum With {.Im = 5, .Re = 5})
做这样的事情对我来说更有意义。
Structure ComNum
Dim Re As Double
Dim Im As Double
Sub add(ByVal br As ComNum)
Re += br.Re
Im += br.Im
End Sub
Sub subt(ByVal br As ComNum)
Re -= br.Re
Im -= br.Im
End Sub
End Structure
然后您可以通过这种方式调用它来更新结构,而无需捕获 returned 值。
a.add(New ComNum With {.Im = 5, .Re = 5})
编辑:现在更了解应该如何执行练习,我会为结构建议这样的事情:
Public Overrides Function ToString() As String
Return String.Format("Re: {0} Im: {1}", Re, Im)
End Function
然后你可以像这样调用.ToString() 方法。虽然,只是一个想法。
Console.WriteLine("The second number added twice and subtracted once from the first number gives {0}", c.ToString())
希望 post 的标题不要太乱。我正在复习上周的一些课程 material,关于这个特殊结构和其中的加减函数,只有一件事我不明白:
Structure ComNum
Dim Re As Double
Dim Im As Double
Function add(ByVal br As ComNum) As ComNum
add.Re = br.Re + Re
add.Im = br.Im + Im
End Function
Function subt(ByVal br As ComNum) As ComNum
subt.Re = br.Re - Re
subt.Im = br.Im - Im
End Function
End Structure
Sub Main()
Dim a, b, c As ComNum
a.Re = 2
a.Im = 3
b.Re = 4
b.Im = 5
c = a.add(b).add(b).subt(b)
Console.WriteLine("The second number added twice and subtracted once from the first number gives {0}+{1}i", c.Re, c.Im)
End Sub
现在,我对函数的理解是,一旦从函数返回任何内容,函数的执行就会在返回值的那一行停止,执行后什么也不会执行。据此,它应该添加实部并退出函数。
我知道我遗漏了一个关键的东西,如果有人能向我解释一下,我将不胜感激。
您设置这些函数的方式是在您每次调用它们时创建一个新的空 ComNum 结构(根据函数名称命名为 add 或 subt)。除非你提前手动 return 它们,否则它将默认为 return 命名结构的函数。
Function add(ByVal br As ComNum) As ComNum
add.Re = br.Re + Re
add.Im = br.Im + Im
End Function
基本上相当于:
Dim add As New ComNum
add.Re = br.Re + Re
add.Im = br.Im + Im
Return add
尽管像 Lars 指出的那样,我不确定您为什么希望它是函数而不是子函数。现在按照您设置的方式使用它需要您执行类似这样的操作来获取 add/subtract 值,因为您需要捕获 returned ComNum 对象。
Dim a As New ComNum With {.Im = 1, .Re = 1}
'Im = 6, Re = 6
a = a.add(New ComNum With {.Im = 5, .Re = 5})
做这样的事情对我来说更有意义。
Structure ComNum
Dim Re As Double
Dim Im As Double
Sub add(ByVal br As ComNum)
Re += br.Re
Im += br.Im
End Sub
Sub subt(ByVal br As ComNum)
Re -= br.Re
Im -= br.Im
End Sub
End Structure
然后您可以通过这种方式调用它来更新结构,而无需捕获 returned 值。
a.add(New ComNum With {.Im = 5, .Re = 5})
编辑:现在更了解应该如何执行练习,我会为结构建议这样的事情:
Public Overrides Function ToString() As String
Return String.Format("Re: {0} Im: {1}", Re, Im)
End Function
然后你可以像这样调用.ToString() 方法。虽然,只是一个想法。
Console.WriteLine("The second number added twice and subtracted once from the first number gives {0}", c.ToString())