Funktionsuttryck (Visual Basic)

Deklarerar namn, parametrar och kod som definierar en Function procedur.

Syntax

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

Delar

  • attributelist

    Valfritt. Se Attributlista.

  • accessmodifier

    Valfritt. Kan vara något av följande:

    Se Åtkomstnivåer i Visual Basic.

  • proceduremodifiers

    Valfritt. Kan vara något av följande:

  • Shared

    Valfritt. Se Delat.

  • Shadows

    Valfritt. Se Skuggor.

  • Async

    Valfritt. Se Async.

  • Iterator

    Valfritt. Se Iterator.

  • name

    Obligatoriska. Namnet på proceduren. Se Deklarerade elementnamn.

  • typeparamlist

    Valfritt. Lista över typparametrar för en allmän procedur. Se Typlista.

  • parameterlist

    Valfritt. Lista över lokala variabelnamn som representerar parametrarna för den här proceduren. Se Parameterlista.

  • returntype

    Krävs om Option Strict är On. Datatyp för det värde som returneras av den här proceduren.

  • Implements

    Valfritt. Anger att den här proceduren implementerar en eller flera Function procedurer, var och en definierad i ett gränssnitt som implementeras av den här procedurens innehållande klass eller struktur. Se Implementeringsinstruktor.

  • implementslist

    Krävs om Implements anges. Function Lista över procedurer som implementeras.

    implementedprocedure [ , implementedprocedure ... ]

    Var implementedprocedure och en har följande syntax och delar:

    interface.definedname

    Delvis beskrivning
    interface Obligatoriskt. Namnet på ett gränssnitt som implementeras av den här proceduren och som innehåller klass eller struktur.
    definedname Obligatoriska. Namn med vilket proceduren definieras i interface.
  • Handles

    Valfritt. Anger att den här proceduren kan hantera en eller flera specifika händelser. Se Referenser.

  • eventlist

    Krävs om Handles anges. Lista över händelser som den här proceduren hanterar.

    eventspecifier [ , eventspecifier ... ]

    Var eventspecifier och en har följande syntax och delar:

    eventvariable.event

    Delvis beskrivning
    eventvariable Obligatoriskt. Objektvariabel deklarerad med datatypen för klassen eller strukturen som genererar händelsen.
    event Obligatoriska. Namnet på den händelse som den här proceduren hanterar.
  • statements

    Valfritt. Block med instruktioner som ska köras i den här proceduren.

  • End Function

    Avslutar definitionen av den här proceduren.

Kommentarer

All körbar kod måste finnas i en procedur. Varje procedur deklareras i sin tur inom en klass, en struktur eller en modul som kallas för den innehållande klassen, strukturen eller modulen.

Om du vill returnera ett värde till anropskoden använder du en Function procedur. Annars använder du en Sub procedur.

Definiera en funktion

Du kan bara definiera en Function procedur på modulnivå. Därför måste deklarationskontexten för en funktion vara en klass, en struktur, en modul eller ett gränssnitt och får inte vara en källfil, ett namnområde, en procedur eller ett block. Mer information finns i Deklarationskontexter och standardåtkomstnivåer.

Function som standard för offentlig åtkomst. Du kan justera deras åtkomstnivåer med åtkomstmodifierarna.

En Function procedur kan deklarera datatypen för det värde som proceduren returnerar. Du kan ange valfri datatyp eller namnet på en uppräkning, en struktur, en klass eller ett gränssnitt. Om du inte anger parametern returntype returnerar Objectproceduren .

Om den här proceduren använder nyckelordet Implements måste den innehållande klassen eller strukturen också ha en Implements -instruktion som omedelbart följer dess Class eller Structure -instruktion. Instruktionen Implements måste innehålla varje gränssnitt som anges i implementslist. Det namn med vilket ett gränssnitt definierar Function (i definedname) behöver dock inte matcha namnet på den här proceduren (i name).

Kommentar

Du kan använda lambda-uttryck för att definiera funktionsuttryck infogade. Mer information finns i Funktionsuttryck och Lambda-uttryck.

Returnerar från en funktion

När proceduren Function återgår till anropskoden fortsätter körningen med -instruktionen som följer instruktionen som anropade proceduren.

Om du vill returnera ett värde från en funktion kan du antingen tilldela värdet till funktionsnamnet eller inkludera det i en Return -instruktion.

Instruktionen Return tilldelar samtidigt returvärdet och avslutar funktionen, vilket visas i följande exempel.

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

I följande exempel tilldelas returvärdet till funktionsnamnet myFunction och använder sedan -instruktionen Exit Function för att returnera.

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

- Exit Function instruktionerna och Return orsakar ett omedelbart utträde från en Function procedur. Valfritt antal Exit Function och Return instruktioner kan visas var som helst i proceduren och du kan blanda Exit Function och Return instruktioner.

Om du använder Exit Function utan att tilldela ett värde till namereturnerar proceduren standardvärdet för den datatyp som anges i returntype. Om returntype inte anges returnerar Nothingproceduren , vilket är standardvärdet för Object.

Anropa en funktion

Du anropar en Function procedur med hjälp av procedurnamnet följt av argumentlistan inom parenteser i ett uttryck. Du kan bara utelämna parenteserna om du inte anger några argument. Din kod är dock mer läsbar om du alltid inkluderar parenteserna.

Du anropar en Function procedur på samma sätt som du anropar alla biblioteksfunktioner som Sqrt, Coseller ChrW.

Du kan också anropa en funktion med hjälp av nyckelordet Call . I så fall ignoreras returvärdet. Användning av nyckelordet Call rekommenderas inte i de flesta fall. Mer information finns i Samtalsinstrukation.

Visual Basic ordnar ibland om aritmetiska uttryck för att öka den interna effektiviteten. Därför bör du inte använda en Function procedur i ett aritmetiskt uttryck när funktionen ändrar värdet för variabler i samma uttryck.

Async Functions

Med funktionen Async kan du anropa asynkrona funktioner utan att använda explicita återanrop eller manuellt dela upp koden mellan flera funktioner eller lambda-uttryck.

Om du markerar en funktion med Async-modifieraren kan du använda Operatorn Await i funktionen. När kontrollen når ett Await uttryck i Async funktionen återgår kontrollen till anroparen och förloppet i funktionen pausas tills den väntade aktiviteten har slutförts. När uppgiften är klar kan körningen återupptas i funktionen.

Kommentar

En Async procedur återgår till anroparen när den antingen stöter på det första väntande objektet som ännu inte har slutförts, eller om det kommer till slutet av proceduren Async , beroende på vilket som inträffar först.

En Async funktion kan ha en returtyp av Task<TResult> eller Task. Ett exempel på en Async funktion som har en returtyp Task<TResult> anges nedan.

En Async funktion kan inte deklarera några ByRef-parametrar .

En undersats kan också markeras med Async modifieraren. Detta används främst för händelsehanterare, där ett värde inte kan returneras. Det AsyncSub går inte att vänta på en procedur och anroparen av en AsyncSub procedur kan inte fånga undantag som genereras av proceduren Sub .

Mer information om Async funktioner finns i Asynkron programmering med Async och Await, Kontrollflöde i Async-program och Async-returtyper.

Iteratorfunktioner

En iteratorfunktion utför en anpassad iteration över en samling, till exempel en lista eller matris. En iteratorfunktion använder yield-instruktionen för att returnera varje element ett i taget. När en Yield-instruktion nås sparas den aktuella platsen i koden. Körningen startas om från den platsen nästa gång iteratorfunktionen anropas.

Du anropar en iterator från klientkoden med hjälp av en För varje... Nästa instruktion.

Returtypen för en iteratorfunktion kan vara IEnumerable, IEnumerable<T>, IEnumeratoreller IEnumerator<T>.

Mer information finns i Iteratorer.

Exempel 1

I följande exempel används -instruktionen Function för att deklarera namn, parametrar och kod som utgör brödtexten i en Function procedur. Med ParamArray modifieraren kan funktionen acceptera ett variabelt antal argument.

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

Exempel 2

I följande exempel anropas funktionen som deklarerats i föregående exempel.

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

Exempel 3

I följande exempel DelayAsync är en AsyncFunction som har en returtyp av Task<TResult>. DelayAsync har en Return instruktion som returnerar ett heltal. Därför måste funktionsdeklarationen ha DelayAsync en returtyp av Task(Of Integer). Eftersom returtypen är Task(Of Integer)genererar utvärderingen av Await uttrycket i DoSomethingAsync ett heltal. Detta visas i den här instruktionen: Dim result As Integer = Await delayTask.

Proceduren startButton_Click är ett exempel på en Async Sub procedur. Eftersom DoSomethingAsync är en Async funktion måste uppgiften för anropet vänta DoSomethingAsync , som följande instruktion visar: Await DoSomethingAsync(). Proceduren startButton_ClickSub måste definieras med Async modifieraren eftersom den har ett Await uttryck.

' 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

Se även