Pernyataan Fungsi (Visual Basic)

Mendeklarasikan nama, parameter, dan kode yang menentukan prosedur Function.

Sintaks

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async | Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ]
    [ statements ]
    [ Exit Function ]
    [ statements ]
End Function

Generator

  • attributelist

    Opsional. Lihat Daftar Atribut.

  • accessmodifier

    Opsional. Bisa jadi salah satu dari yang berikut:

    Lihat Tingkat akses di Visual Basic.

  • proceduremodifiers

    Opsional. Bisa jadi salah satu dari yang berikut:

  • Shared

    Opsional. Lihat Dibagikan.

  • Shadows

    Opsional. Lihat Bayangan.

  • Async

    Opsional. Lihat Asinkron.

  • Iterator

    Opsional. Lihat Iterator.

  • name

    Harus diisi. Nama prosedur. Lihat Nama Elemen yang Dideklarasikan.

  • typeparamlist

    Opsional. Daftar parameter jenis untuk prosedur generik. Lihat Daftar Jenis.

  • parameterlist

    Opsional. Daftar nama variabel lokal yang mewakili parameter prosedur ini. Lihat Daftar parameter.

  • returntype

    Diperlukan jika Option Strict adalah On. Jenis data nilai yang dikembalikan oleh prosedur ini.

  • Implements

    Opsional. Menunjukkan bahwa prosedur ini menerapkan satu atau lebih prosedur Function, masing-masing ditentukan dalam antarmuka yang diterapkan oleh prosedur ini yang berisi kelas atau struktur. Lihat Pernyataan Implements.

  • implementslist

    Diperlukan jika Implements diberikan. Daftar prosedur Function yang diterapkan.

    implementedprocedure [ , implementedprocedure ... ]

    Setiap implementedprocedure memiliki sintaks dan bagian berikut:

    interface.definedname

    Bagian Deskripsi
    interface Harus diisi. Nama antarmuka yang diterapkan oleh kelas atau struktur yang berisi prosedur ini.
    definedname Harus diisi. Nama yang digunakan untuk menentukan prosedur dalam interface.
  • Handles

    Opsional. Menunjukkan bahwa prosedur ini dapat menangani satu atau lebih peristiwa tertentu. Lihat Handel.

  • eventlist

    Diperlukan jika Handles diberikan. Daftar peristiwa yang ditangani prosedur ini.

    eventspecifier [ , eventspecifier ... ]

    Setiap eventspecifier memiliki sintaks dan bagian berikut:

    eventvariable.event

    Bagian Deskripsi
    eventvariable Harus diisi. Variabel objek dideklarasikan dengan jenis data kelas atau struktur yang menaikkan peristiwa.
    event Harus diisi. Nama peristiwa yang ditangani prosedur ini.
  • statements

    Opsional. Blok pernyataan yang akan dijalankan dalam prosedur ini.

  • End Function

    Mengakhiri definisi prosedur ini.

Keterangan

Semua kode yang dapat dieksekusi harus berada di dalam prosedur. Setiap prosedur, pada gilirannya, dinyatakan dalam kelas, struktur, atau modul yang disebut sebagai kelas, struktur, atau modul yang berisi.

Untuk mengembalikan nilai ke kode panggilan, gunakan prosedur Function; jika tidak, gunakan prosedur Sub.

Menentukan Fungsi

Anda hanya dapat menentukan prosedur Function di tingkat modul. Oleh karena itu, konteks deklarasi untuk fungsi haruslah kelas, struktur, modul, atau antarmuka dan tidak boleh berupa file sumber, namespace, prosedur, atau blok. Untuk informasi selengkapnya, lihat Konteks Deklarasi dan Tingkat Akses Default.

Prosedur Function default ke akses publik. Anda dapat menyesuaikan tingkat aksesnya dengan pengubah akses.

Prosedur Function dapat mendeklarasikan jenis data nilai yang dikembalikan prosedur. Anda dapat menentukan jenis data apa pun atau nama enumerasi, struktur, kelas, atau antarmuka. Jika Anda tidak menentukan parameter returntype, prosedur akan mengembalikan Object.

Jika prosedur ini menggunakan kata kunci Implements, kelas atau struktur yang berisi juga harus memiliki pernyataan Implements yang segera mengikuti pernyataan Class atau Structure. Pernyataan Implements harus menyertakan setiap antarmuka yang ditentukan dalam implementslist. Namun, nama di mana antarmuka mendefinisikan Function (dalam definedname) tidak perlu cocok dengan nama prosedur ini (dalam name).

Catatan

Anda dapat menggunakan ekspresi lambda untuk menentukan ekspresi fungsi sebaris. Untuk informasi selengkapnya, lihat Ekspresi Fungsi dan Ekspresi Lambda.

Mengembalikan dari Fungsi

Ketika prosedur Function kembali ke kode panggilan, eksekusi berlanjut dengan pernyataan yang mengikuti pernyataan yang memanggil prosedur.

Untuk mengembalikan nilai dari fungsi, Anda dapat menetapkan nilai ke nama fungsi atau menyertakannya dalam pernyataan Return.

Pernyataan Return secara bersamaan menetapkan nilai pengembalian dan keluar dari fungsi, seperti yang ditunjukkan contoh berikut.

Function MyFunction(ByVal j As Integer) As Double
    Return 3.87 * j
End Function

Contoh berikut menetapkan nilai pengembalian ke nama fungsi myFunction, lalu menggunakan pernyataan Exit Function untuk kembali.

Function MyFunction(ByVal j As Integer) As Double
    MyFunction = 3.87 * j
    Exit Function
End Function

Pernyataan Exit Function dan Return menyebabkan keluar cepat dari prosedur Function. Sejumlah pernyataan Exit Function dan Return dapat muncul di mana saja dalam prosedur, dan Anda dapat mencampur pernyataan Exit Function dan Return.

Jika Anda menggunakan Exit Function tanpa menetapkan nilai ke name, prosedur mengembalikan nilai default untuk jenis data properti di returntype. Jika returntype tidak ditentukan, prosedur mengembalikan Nothing, yang merupakan nilai default untuk Object.

Memanggil Fungsi

Anda memanggil prosedur Function dengan menggunakan nama prosedur, diikuti dengan daftar argumen dalam tanda kurung, dalam ekspresi. Anda dapat menghilangkan tanda kurung hanya jika Anda tidak menyediakan argumen apa pun. Namun, kode Anda lebih mudah dibaca jika Anda selalu menyertakan tanda kurung.

Anda memanggil prosedur Function dengan cara yang sama seperti Anda memanggil fungsi pustaka apa pun seperti Sqrt, Cos, atau ChrW.

Anda juga dapat memanggil fungsi dengan menggunakan kata kunci Call. Dalam hal ini, nilai yang dikembalikan diabaikan. Penggunaan kata kunci Call tidak direkomendasikan dalam banyak kasus. Untuk informasi selengkapnya, lihat Memanggil Pernyataan.

Visual Basic terkadang menyusun ulang ekspresi aritmetika untuk meningkatkan efisiensi internal. Untuk alasan tersebut, Anda tidak boleh menggunakan prosedur Function dalam ekspresi aritmetika saat fungsi mengubah nilai variabel dalam ekspresi yang sama.

Fungsi Asinkron

Fitur Asinkron memungkinkan Anda untuk menjalankan fungsi asinkron tanpa menggunakan panggilan balik eksplisit atau secara manual memisahkan kode Anda di beberapa fungsi atau ekspresi lambda.

Jika Anda menandai fungsi dengan peubah Asinkron, Anda dapat menggunakan operator Menunggu dalam fungsi tersebut. Saat kontrol mencapai ekspresi Await dalam fungsi Async, kontrol kembali ke pemanggil, dan kemajuan dalam fungsi ditangguhkan hingga tugas yang ditunggu selesai. Saat tugas selesai, eksekusi dapat dilanjutkan dalam metode.

Catatan

Prosedur Async kembali ke pemanggil ketika bertemu dengan objek pertama yang ditunggu yang belum selesai, atau sampai ke akhir prosedur Async, mana yang lebih dulu.

Fungsi Async dapat memiliki jenis pengembalian Task<TResult> atau Task. Contoh fungsi Async yang memiliki jenis Task<TResult> pengembalian disediakan di bawah ini.

Fungsi Async tidak dapat mendeklarasikan parameter ByRef apa pun.

Pernyataan Sub juga dapat ditandai dengan peubah Async. Ini terutama digunakan untuk penanganan aktivitas, di mana nilai tidak dapat dikembalikan. Prosedur AsyncSub tidak dapat ditunggu, dan pemanggil prosedur AsyncSub tidak dapat menangkap pengecualian yang dilemparkan oleh prosedur Sub.

Untuk informasi selengkapnya tentang fungsi Async, lihat Pemrograman Asinkron dengan Asinkron dan Tunggu, Alur Kontrol Dalam Program Asinkron, dan Jenis Pengembalian Asinkron.

Fungsi Iterator

iterator melakukan perulangan kustom pada koleksi, seperti daftar atau larik. Iterator menggunakan pernyataan Hasil untuk mengembalikan setiap elemen satu per satu. Saat pernyataan Hasil tercapai, lokasi saat ini dalam kode diingat. Eksekusi dimulai ulang dari lokasi tersebut pada saat fungsi iterator dipanggil.

Anda memanggil iterator dari kode klien dengan menggunakan pernyataan For Each…Next.

Jenis pengembalian iterator dapat berupa IEnumerable, IEnumerable<T>, IEnumerator, atau IEnumerator<T>.

Untuk informasi selengkapnya, lihat Iterator.

Contoh 1

Contoh berikut menggunakan pernyataan Function untuk mendeklarasikan nama, parameter, dan kode yang membentuk isi prosedur Function. Peubah ParamArray memungkinkan fungsi untuk menerima jumlah variabel argumen.

Public Function CalcSum(ByVal ParamArray args() As Double) As Double
    CalcSum = 0
    If args.Length <= 0 Then Exit Function
    For i As Integer = 0 To UBound(args, 1)
        CalcSum += args(i)
    Next i
End Function

Contoh 2

Contoh berikut memanggil fungsi yang dideklarasikan dalam contoh sebelumnya.

Module Module1

    Sub Main()
        ' In the following function call, CalcSum's local variables
        ' are assigned the following values: args(0) = 4, args(1) = 3,
        ' and so on. The displayed sum is 10.
        Dim returnedValue As Double = CalcSum(4, 3, 2, 1)
        Console.WriteLine("Sum: " & returnedValue)
        ' Parameter args accepts zero or more arguments. The sum
        ' displayed by the following statements is 0.
        returnedValue = CalcSum()
        Console.WriteLine("Sum: " & returnedValue)
    End Sub

    Public Function CalcSum(ByVal ParamArray args() As Double) As Double
        CalcSum = 0
        If args.Length <= 0 Then Exit Function
        For i As Integer = 0 To UBound(args, 1)
            CalcSum += args(i)
        Next i
    End Function

End Module

Contoh 3

Dalam contoh berikut, DelayAsync adalah AsyncFunction yang memiliki jenis pengembalian Task<TResult>. DelayAsync memiliki pernyataan Return yang mengembalikan bilangan bulat. Oleh karena itu deklarasi fungsi DelayAsync perlu memiliki jenis pengembalian Task(Of Integer). Karena jenis pengembalian adalah Task(Of Integer), evaluasi ekspresi Await dalam DoSomethingAsync menghasilkan bilangan bulat. Ini ditunjukkan dalam pernyataan ini: Dim result As Integer = Await delayTask.

Prosedur startButton_Click ini adalah contoh prosedur Async Sub. Karena DoSomethingAsync adalah fungsi Async, tugas untuk panggilan DoSomethingAsync harus ditunggu, seperti yang ditunjukkan oleh pernyataan berikut: Await DoSomethingAsync(). Prosedur startButton_ClickSub harus ditentukan dengan peubah Async karena memiliki ekspresi Await.

' Imports System.Diagnostics
' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.
Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs) Handles startButton.Click
    Await DoSomethingAsync()
End Sub

Private Async Function DoSomethingAsync() As Task
    Dim delayTask As Task(Of Integer) = DelayAsync()
    Dim result As Integer = Await delayTask

    ' The previous two statements may be combined into
    ' the following statement.
    ' Dim result As Integer = Await DelayAsync()

    Debug.WriteLine("Result: " & result)
End Function

Private Async Function DelayAsync() As Task(Of Integer)
    Await Task.Delay(100)
    Return 5
End Function

'  Output:
'   Result: 5

Lihat juga