Procedury rozwiązywania problemów (Visual Basic)

Ta strona zawiera listę niektórych typowych problemów, które mogą wystąpić podczas pracy z procedury.

Zwracanie typu tablicowego z procedurę typu Function

Jeśli Function procedura zwraca typ danych array, nie można użyć Function nazwę do przechowywania wartości elementów tablicy.Jeśli spróbujemy to zrobić, kompilator zinterpretuje ją jako wywołanie do Function.Poniższy przykład generuje błędy kompilatora.

Function allOnes(ByVal n As Integer) As Integer()

For i As Integer = 1 To n - 1

' The following statement generates a COMPILER ERROR.

allOnes(i) = 1

Next i

' The following statement generates a COMPILER ERROR.

Return allOnes()

End Function

Instrukcja allOnes(i) = 1 generuje błąd kompilatora, ponieważ wydaje się, aby zadzwonić do allOnes z argumentu niewłaściwy typ danych (pojedyncza Integer zamiast Integer tablicy).Instrukcja Return allOnes() generuje błąd kompilatora, ponieważ wydaje się, aby zadzwonić do allOnes z żadnego argumentu.

Właściwe podejście: móc modyfikować elementy tablicy, który ma być zwrócony, należy zdefiniować jako zmiennej lokalnej tablicy wewnętrznej.Poniższy przykład kompiluje bez błędu.

Function allOnes(ByVal n As Integer) As Integer()
    Dim i As Integer, iArray(n) As Integer 
    For i = 0 To n - 1
        iArray(i) = 1
    Next i
    Return iArray
End Function

Argument nie modyfikowane przez wywołanie procedury

Jeżeli zamierzasz zezwolić procedury zmienić element programowania, leżących u podstaw argumentu kod wywołujący musi przekazać je przez odniesienie.Ale procedurę można uzyskać dostęp do elementów typu argumentu, nawet jeśli przekażemy przez wartość.

  • Podstawowa zmiennej.Aby zezwolić na procedury zamienić wartość zmiennej podstawowej samego elementu, procedurę należy zadeklarować parametr ByRef (Visual Basic).Ponadto kod wywołujący musi nie należy ujmować argument w nawiasach, ponieważ nadrzędne, ByRef przekazując mechanizmu.

  • Odwołać elementów typu.Jeśli zadeklarować parametr ByVal (Visual Basic), procedury nie można zmodyfikować zmienną podstawowej samego elementu.Jednakże jeśli argument jest typem odwołania, procedury można zmodyfikować członków obiektu, na które wskazuje, nawet, jeśli nie można go zastąpić wartość zmiennej.Na przykład jeśli argument jest zmienną tablicową, procedury nie można przypisać nowej tablicy do niego, ale można zmienić, jeden lub więcej z jej elementów.Zmienione elementy są odzwierciedlane w podstawowej zmiennej tablicy w kod wywołujący.

Poniższy przykład definiuje dwie procedury, które take zmiennej tablicy wartości i działać na jego elementów.Procedura increase po prostu doda do każdego elementu.Procedura replace przypisuje nową tablicę do parametru a() , a następnie dodaje do każdego elementu.Jednak ponowne przypisanie nie wpływa na podstawowej zmiennej tablicy w kod wywołujący ponieważ a() jest zadeklarowany jako ByVal.

Public Sub increase(ByVal a() As Long)
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub
Public Sub replace(ByVal a() As Long)
    Dim k() As Long = {100, 200, 300}
    a = k
    For j As Integer = 0 To UBound(a)
        a(j) = a(j) + 1
    Next j
End Sub

Poniższy przykład wykonywania wywołań do increase i replace.

Dim n() As Long = {10, 20, 30, 40}
Call increase(n)
MsgBox("After increase(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
Call replace(n)
MsgBox("After replace(n): " & CStr(n(0)) & ", " & 
    CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))

Pierwszy MsgBox wywołania Wyświetla "po increase(n): 11, 21, 31, 41".Ponieważ n jest typem odwołania, increase można zmienić jej członków, mimo że jest on przekazywany ByVal.

Drugi MsgBox wywołania Wyświetla "po replace(n): 11, 21, 31, 41".Ponieważ n jest przekazywana ByVal, replace nie może zmodyfikować zmienną n przypisując nową macierz.Gdy replace powoduje utworzenie nowej instancji array k i przypisuje go do zmiennej lokalnej a, traci ona odniesienie do n przekazany przez kod wywołujący.Kiedy zwiększany członków a, lokalnej tablicy k dotyczy.

Właściwe podejście: , aby móc modyfikować podstawowych element zmiennej, sam, przekazać je przez odniesienie.Poniższy przykład przedstawia zmiany w deklaracji z replace ją zastąpić inną w kod wywołujący jednej tablicy, która umożliwia.

Public Sub replace(ByRef a() As Long)

Nie można zdefiniować przeciążenia

Jeśli chcesz zdefiniować przeciążony wersji procedurę, należy użyć takiej samej nazwie, ale inny podpis.Jeśli kompilator nie może rozróżnić swoje zgłoszenia z przeciążenia o tej samej sygnaturze, generuje błąd.

Podpisu procedury określone przez nazwę procedury i listy parametrów.Każdego przeciążenie musi mieć taką samą nazwę jak inne overloads, ale muszą różnić się od ich wszystkich w co najmniej jeden z innymi składnikami podpis.Aby uzyskać więcej informacji, zobacz Przeciążanie procedury (Visual Basic).

Następujące elementy, mimo że odnoszą się one do listy parametrów nie są składniki procedury podpisu:

  • Procedura modyfikator słowa kluczowe, takie jak Public, Shared, iStatic

  • Nazwy parametrów

  • Parametr modyfikator słowa kluczowe, takie jak ByRef iOptional

  • Typ danych zwracanej wartości (z wyjątkiem dla operatora konwersji)

Procedura nie mogą przeciążać poprzez różnicowanie tylko jeden lub więcej z wymienionych elementów.

Właściwe podejście: , aby można było zdefiniować przeciążenie procedury, musi się różnić podpis.Ponieważ należy użyć takiej samej nazwie, trzeba zmieniać liczbę, zamówienia lub typy danych parametrów.Ogólne procedury można zmieniać liczbę parametrów typu.W operatorze konwersji (CType — Funkcja (Visual Basic)), można zmieniać typ zwracany.

Przeciążenie rozdzielczość opcjonalne i argumenty ParamArray

Jeśli są przeciążanie procedury z jednym lub więcej Optional (Visual Basic) parametry lub ParamArray (Visual Basic) parametr, trzeba unikać duplikowania dowolną z niejawny overloads.Aby uzyskać informacje, zobacz Zagadnienia dotyczące przeciążania procedur (Visual Basic).

Wywołanie niewłaściwej wersji przeciążone procedury

Jeśli procedura ma kilka wersji przeciążony, należy znać ich listy parametrów i zrozumieć, jak Visual Basic rozwiązuje wywołań między overloads.W przeciwnym razie można wywołać przeciążenia innych niż zamierzone.

Po ustaleniu, przeciążenie, którym chcesz się połączyć, należy uważać, aby przestrzegać następujących zasad:

  • Podać poprawną liczbę argumentów i w odpowiedniej kolejności.

  • W idealnej sytuacji swoje argumenty powinny mieć dokładnie te same typy danych jako odpowiednie parametry.W każdym przypadku typ danych każdego argumentu należy poszerzyć odpowiadająca jej odpowiedniego parametru.Ta zasada obowiązuje nawet z Option Strict — Instrukcja ustawiona na Off.Jeśli przeciążenie wymaga wszelkich konwersji zawężającej z listy argumentów, które przeciążenie jest nieodpowiedni do wywołania.

  • Jeśli zostanie podane argumenty, które wymagają poszerzenia, należy ich typy danych, jak najbliżej odpowiadające im typy danych parametru.Jeśli dwóch lub więcej overloads zaakceptować Twoje typy danych argumentów, kompilator usuwa zadzwonić do przeciążenia, że wymaga co najmniej kwota poszerzenia.

Można zmniejszyć ryzyko wystąpienia niezgodności typu danych za pomocą CType — Funkcja (Visual Basic) konwersji słowa kluczowego, przygotowując swoje argumenty.

Błąd rozpoznawania przeciążenie

Gdy wywołuje procedurę przeciążony kompilator próbuje wyeliminować wszystkie oprócz overloads.Jeśli się powiedzie, rozwiązuje wywołanie tego przeciążenia.Jeśli eliminuje wszystkich overloads lub nie można go zmniejszyć kwalifikowanych overloads do jednego kandydata, generuje błąd.

Poniższy przykład ilustruje proces rozpoznawania przeciążenie.

Overloads Sub z(ByVal x As Byte, ByVal y As Double)
End Sub 
Overloads Sub z(ByVal x As Short, ByVal y As Single)
End Sub 
Overloads Sub z(ByVal x As Integer, ByVal y As Single)
End Sub
Dim r, s As Short 
Call z(r, s)
Dim p As Byte, q As Short 
' The following statement causes an overload resolution error. 
Call z(p, q)

W pierwszym wywołaniem kompilator eliminuje pierwszy przeciążenia, ponieważ typ pierwszego argumentu (Short) umożliwia zawężenie typu odpowiedniego parametru (Byte).Następnie program eliminuje trzeciego przeciążenia, ponieważ każdy argument należy wpisać w drugim przeciążenie (Short i Single) rozszerza się do odpowiedniego typu w trzecim przeciążenie (Integer i Single).Drugi przeciążenie wymaga mniej poszerzenie tak kompilator używa go do obsługi wywołania.

W drugim wywołanie kompilator nie można wyeliminować dowolne przeciążeniem w oparciu o zwężenie.Ponieważ może wywołać drugi przeciążenie z mniej poszerzenie typy argumentów eliminuje trzeciego przeciążenie z tego samego powodu, jak w pierwszym wywołaniem.Jednak kompilator nie może rozpoznać między pierwszym i drugim overloads.Każdy ma jeden typ parametru zdefiniowanego rozszerzająca odpowiedniego typu w innym (Byte do Short, ale Single do Double).Kompilator dlatego generuje błąd rozpoznawania przeciążenie.

Właściwe podejście: , aby można było wywołać procedurę przeciążony bez niejednoznaczności, należy użyć CType — Funkcja (Visual Basic) do zgodne typy danych argumentów do typów parametru.W poniższym przykładzie pokazano wywołanie do z który wymusza rozdzielczość do drugiego przeciążenie.

Call z(CType(p, Short), CType(q, Single))

Przeciążenie rozdzielczość opcjonalne i argumenty ParamArray

Jeśli overloads dwie procedury mają identycznych podpisach, z wyjątkiem, że ostatni parametr jest zadeklarowany jako Optional (Visual Basic) w jednym i ParamArray (Visual Basic) w innych, kompilator usuwa wywołania do tej procedury, zgodnie z najbliższy im odpowiednik.Aby uzyskać więcej informacji, zobacz Rozpoznanie przeciążenia (Visual Basic).

Zobacz też

Koncepcje

Procedury w Visual Basic

Sub — Procedury (Visual Basic)

Procedury funkcji (Visual Basic)

Procedury własności (Visual Basic)

Procedury operatorów (Visual Basic)

Parametry i argumenty procedur (Visual Basic)

Przeciążanie procedury (Visual Basic)

Zagadnienia dotyczące przeciążania procedur (Visual Basic)

Rozpoznanie przeciążenia (Visual Basic)