vb.net 教程 2-9 过程

过程,也或直接称为方法、函数。
Sub过程(子过程)和Function(函数过程)

基本的语法:
访问级别 Sub 函数名称(ByVal/ByRef 参数 as 类型, ByVal/ByRef 参数2 as 类型……)
    语句块
end sub

访问级别 Function 函数名称(ByVal/ByRef 参数 as 类型, ByVal/ByRef 参数2 as 类型……) as 类型
    语句块
end function


注意的是,sub 语句不返回值,function 语句可以返回值,也可以不返回值,如果vs认为function没有返回值,它会给出一个警告提示,虽然不影响运行,但是确实不好看,我们还是尽量确保有返回值。

访问级别:通常情况下,在sub、function前面加上访问级别的关键词,如:Public、Protected、Friend、Private,限制对函数的访问。
如果在Module(模块)中,sub或者function前面没有加上访问级别的关键词,那么默认是Public。
对于Public的方法,在整个工程中都可以访问


*个人理解,无论是sub还是function都一定程度上解决了代码重复使用的问题。
如下例子:
    Sub main()
        Dim info As String
        info = "这是一个测试"
        Call showInfo(info)
        info = "测试开始"
        Call showInfo(info)
        info = "测试结束"
        Call showInfo(info)
        Console.ReadKey()

    End Sub

    Sub showInfo(ByVal info As String)
        Console.WriteLine("注意:" & info)
    End Sub
sub main()中调用了showInfo()三次。输出结果如下:
注意:这是一个测试
注意:测试开始
注意:测试结束

注意,Call并不是必须,.一般情况下net中不提倡使用Call(请参见msdn call语句),这是我的个人习惯。

参数中,byval和byref 的区别在于:byval是值传递,byref是引用传递,简单来说,
sub/function的参数如果是byval,那么在过程中修改不了参数本身的值,而byref,在过程中可以修改参数本身的值,
*个人理解:byref是将参数对应的指针地址传递给过程。因此我习惯于称呼byval为传值,称呼byref为传址。
如下例:
    Sub main()
        Dim info As String
        info = "这是测试:"

        Console.WriteLine("显示byval使用情况")
        Call showInfo1(info)
        Console.WriteLine(info)

        Console.WriteLine("显示byref使用情况")
        Call showInfo2(info)
        Console.WriteLine(info)

        Console.ReadKey()

    End Sub

    Sub showInfo1(ByVal info As String)
        Console.WriteLine(info)
        info = info & "byval"
    End Sub

    Sub showInfo2(ByRef info As String)
        Console.WriteLine(info)
        info = info & "byref"
    End Sub
来看看结果:
稍微分析一下:
调用 showInfo1() ,由于参数是值传递,所以,在 showInfo1() 内部无论怎么修改参数info的值,并不会影响实际的值,
但是调用 showInfo2() ,由于参数是引用传递,在 showInfo2() 内部修改了参数info的值,实际的值也跟着变了。

function过程可以返回值,如下,两个整数相加,返回结果:
    Sub main()
        Dim a, b As Integer
        a = 10
        b = 21
        Console.WriteLine("{0}+{1}={2}", a, b, add(a, b))
        Console.ReadKey()
    End Sub


    Function add(ByVal i As Integer, ByVal j As Integer) As Integer
        add = i + j
    End Function

我们也可以使用
return (i+j )
来替换
add=i+j
return将直接退出function并返回值。例如:
    Sub main()
        Dim month As Integer
        Dim strMonth As String
        Dim strSeason As String

        Console.WriteLine("输入你喜欢的月份:")
        strMonth = Console.ReadLine()
        Try
            month = Integer.Parse(strMonth)
            strSeason = yourChoice(month)
            Console.WriteLine("你喜欢的季节是:" & strSeason)

        Catch ex As Exception
            Console.WriteLine("输入的不是数字")
        End Try
        Console.ReadKey()
    End Sub


    Function yourChoice(ByVal InputInfo As Integer) As String
        Select Case InputInfo
            Case 1, 2, 3
                Return "春季"
            Case 4, 5, 6
                Return "夏季"
            Case 7, 8, 9
                Return "秋季"
            Case 10, 11, 12
                Return "冬季"
            Case Else
                Return "无"
        End Select
    End Function


另外,在sub中可以使用exit sub ,function中使用 exit function ,立即退出过程。
还是看个简单的例子:
    Sub main()
        Dim students() As String = {"赵甲", "钱乙", "孙丙", "李丁", "周戊", "吴己", "郑庚", "王辛"}
        Dim tobeFind As String
        tobeFind = "李丁"
        If findElement(students, tobeFind) = True Then
            Console.WriteLine("在学生中找到")
        Else
            Console.WriteLine("在学生中未找到")
        End If
        Console.ReadKey()
    End Sub

    Function findElement(ByVal students() As String, ByVal someone As String) As Integer
        findElement = False
        For i As Integer = 0 To students.Length - 1
            If someone = students(i) Then
                findElement = True
                Exit Function
            End If
        Next
    End Function

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供参考。

学习更多vb.net知识,请参看vb.net 教程 目录



阅读更多
版权声明:本文为博主原创文章,转载请显著位置标明出处,未经博主允许不得用于商业目的。 https://blog.csdn.net/UruseiBest/article/details/70037891
个人分类: vb.net 教程
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭