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 Procedura przeciążenie (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 (Funkcja CType (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 Opcjonalne (Visual Basic) parametry lub ParamArray (Visual Basic) parametr, trzeba unikać duplikowania dowolną z niejawny overloads.Aby uzyskać informacje, zobacz Uwagi w przeciążanie 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 Opcja ścisłego instrukcji 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ą Funkcja CType (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ć Funkcja CType (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 Opcjonalne (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 Przeciążenia (Visual Basic).
Zobacz też
Koncepcje
Procedury typu Sub (Visual Basic)
Procedury typu Function (Visual Basic)
Właściwość procedur (Visual Basic)
Operator procedur (Visual Basic)
Parametry procedury i argumenty (Visual Basic)
Procedura przeciążenie (Visual Basic)