编程基础:函数和过程
为了避免一遍又一遍地重写大量的代码,您可以使用子程序,子程序有两种类型:过程和函数。例如,在程序中,如果您想了解今天的日期,而不是每次想要计算日期时都编写一个单独的子程序,您可能可以使用 date()
。这是一个函数,当您调用它时,它会返回一个值。它是由其他人编写的,您可以根据需要重复使用它。在行业中编写的任何程序都会使用子程序来调用诸如:console.writeline(), printScore(), deleteRecord()
之类的东西。过程和函数允许您
- 重用代码
- 构建您的编程结构
- 轻松地将其他人的代码整合进来
区分过程和函数的一个简单方法是看它们的名称
- 函数很有趣:如果您调用它们,它们会返回一个值
- 过程不好玩:如果您调用它们,它们不会返回任何值。(这些在 Visual Basic 中被称为
sub
)
函数和过程之间的区别比这更复杂,但上述内容可以作为一个经验法则
在 VB.NET 中,您使用 `Sub` 命令来声明过程,因此在您看到下面的 `Sub` 时,请将其读作 `Procedure` |
声明是在您声明过程/函数的名称以及您想要执行的代码的地方。即使您声明了一个过程/函数,也不意味着代码会运行,您需要一个 _调用_ 来真正执行代码。
Sub printNumber()
console.writeline(number1)
End Sub
函数略有不同,因为它们返回的值必须在它们的声明中包含一个返回函数。并且您必须指定要返回的值的数据类型,在下面的示例中,该数据类型是通过:`..) as Integer` 指定的整数
Function printNumber() as Integer
return number1
End Function
调用允许您运行在过程/函数中声明的代码。通过将调用作为代码的一部分,您可以构建各种编程结构。请记住,函数很有趣,因此您应该对返回的值做一些事情。
printNumber() ' a procedure call
console.writeline(printNumber()) ' a function call
dim x = MaximumSpeed() ' another function call
参数允许您将值传递给您声明的过程和函数,您可以传递各种数据作为参数,并且可以传递任意多个参数。
扩展:参数与实参 参数通常被称为实参。从技术上讲,它们非常相似,但并不相同。当您描述一个过程或函数,并识别它可以接受的数据时,每个数据都是一个参数。当您稍后在程序中使用过程或函数,并为它提供实际的数据(或多个数据)时,这些数据被称为实参。在实践中,这两个术语经常互换使用(例如,参见 StackOverflow:参数和实参的区别?) |
'declaration
Sub printNumber(number1 as integer) 'one parameter
console.writeline(number1)
End Sub
'...
'call
printNumber(4)
输出将是
4
'declaration
Sub printNameAge(name as string, age as integer) 'two parameters
console.writeline(name & " is " & age & " years old")
End Sub
'...
'call
printNameAge("Mounir", 17)
输出将是
Mounir 17 岁
'declaration
function squareNumber(number1 as integer) as integer 'one parameter
return (number1 * number1)
End Function
'...
'call
console.writeline(squareNumber(4))
请注意,由于这是一个函数,我们必须将调用包含在一个方程式中。它返回一个值,它不能独立存在。输出将是
16
练习:函数和过程 函数和过程有什么区别? 答案 函数返回的值,过程可能返回也可能不返回值。
为什么要在代码中使用子程序(函数和过程)? 答案
编写一个函数声明,其标识符为 Avg,该函数将接受 3 个数字(num1、num2、num3)并返回平均值 答案 Function Avg(num1, num2, num3)
return (num1 + num2 + num3) / 3
End Function
对于上面的函数,编写包含函数调用以计算用户输入的三个数字的平均值的代码 代码输出
num1 = 4 答案 dim a, b, c as integer
console.write("input num1 = ")
a = console.readline()
console.write("input num2 = ")
b = console.readline()
console.write("input num3 = ")
c = console.readline()
console.write("Average = " & Avg(a,b,c))
Sub nameTimes(name, num)
for x = 1 to num
console.writeline(name)
next
End Sub
对于上面的过程,列出
答案
|
您传递给过程或函数的参数被称为引用。这意味着您指向它,您将直接更改它的值,并且在过程或函数中对它进行的任何更改都会更改原始值。
Dim number1 as integer = 123
Sub Main()
console.writeline(number1)
IncPrintNumber(number1)
console.writeline(number1)
End Sub
Sub IncPrintNumber(ByRef num as integer)
num = num + 1
console.writeline(num)
End Sub
输出将是
123
124
124
您传递给过程或函数的参数会被复制。这意味着您取的是传递到过程或函数调用中的原始值的副本。在过程或函数中对它进行的任何更改都不会更改原始值。
Dim number1 as integer = 123
Sub Main()
console.writeline(number1)
IncPrintNumber(number1)
console.writeline(number1)
End Sub
Sub IncPrintNumber(ByVal num as integer)
num = num + 1
console.writeline(num)
End Sub
这会保存 number1 值的局部变量,将其存储在 num 中,它仅在 IncPrintNumber 子程序内有效。输出将是
123
124
123
练习:ByRef 和 ByVal Sub Main()
dim a as integer = 7
dim b as integer = 8
Add(a,b)
console.writeline(a)
End Sub
Sub Add(ByXXX num1 as integer, ByXXX num2 as integer)
num1 = num1 + num2
End Sub
当 `ByXXX = ByVal` 时,上面的代码的输出是什么? 答案 代码输出
7
当 `ByXXX = ByRef` 时,上面的代码的输出是什么? 答案 代码输出
15
Sub Swap(ByRef p as string, ByVal q as string)
dim temp as string
temp = p
p = q
q = temp
console.writeline(p & " - " & q)
End Sub
Sub Main()
dim s1 as string = "hello"
dim s2 as string = "goodbye"
Swap(s2, s1)
console.writeline(s2 & " - " & s1)
End Sub
上面的代码的输出是什么? 答案 代码输出
hello - goodbye
按值传递的参数和按引用传递的参数有什么区别? 答案 按值传递的参数会复制传递到子程序中的参数的值。对该值进行的任何更改都不会影响原始值。 按引用传递的参数会传递到变量的链接。对子程序中的参数进行的任何更改都会更改原始变量。 |