Sdílet prostřednictvím


Řešení potíží s procedurami (Visual Basic)

Na této stránce jsou uvedeny některé běžné problémy, které se mohou vyskytnout při práci s postupy.

Návrat z funkce řízení typu pole

Pokud Function postup a vrátí hodnotu typu dat pole, nelze použít Function k uložení hodnot v prvky pole název.Pokud se pokusíte provést, kompilátor interpretuje jako volání Function.Následující příklad vytváří chyby kompilátoru.

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

Prohlášení allOnes(i) = 1 vygeneruje chybu kompilátoru, protože volání allOnes s argument typu nesprávná data (jednoznačná Integer místo Integer matice).Příkaz Return allOnes() vygeneruje chybu kompilátoru, protože volání allOnes s žádný argument.

Správný přístup: mohli upravovat jednotlivé prvky matice, která má být vrácena, definovat jako místní proměnné vnitřní pole.Následující příklad kompiluje bez chyby.

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 není upravena pomocí volání procedury

Pokud máte v úmyslu povolit postupem změnit programovací element podkladových argument volající kód, musí jej předat odkazem.Ale postup přístup prvky argument typu odkaz i v případě předání hodnotou.

  • Základní proměnné.Chcete-li nahradit hodnotu proměnné podkladové prvku samotném postup, postup musí deklarovat parametr ByRef (Visual Basic).Také volající kód není uzavřete argument v závorkách, protože by přepsat, ByRef mechanismus předávání.

  • Odkazy na prvky typu.Je-li deklarovat parametr ByVal (Visual Basic), postup nelze změnit základní proměnné prvku samotném.Však, pokud je argumentem Typ odkazu, postupem změnit členy objektu, na který odkazuje, i když jej nelze nahradit hodnotu proměnné.Pokud argument je proměnné pole, například postup nelze přiřadit nové pole k ní, ale můžete změnit, jednu nebo více jeho prvky.Změněných prvků se projeví v podkladové proměnné array volající kód.

Následující příklad definuje dva postupy, které přijme podle hodnoty proměnné array a pracovat na jeho prvky.Postup increase jednoduše přidá jeden pro každý prvek.Postup replace nové pole přiřadí parametru a() a pak přidá do každého prvku.Opětovné přiřazení však neovlivňuje základní proměnné array volající kód, protože a() je deklarována 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

Následující příklad provádí volání na increase a 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)))

První MsgBox volání zobrazí "po increase(n): 11, 21, 31, 41".Protože n je typ odkazu, increase můžete změnit jeho členů, přestože je předán ByVal.

Druhý MsgBox volání zobrazí "po replace(n): 11, 21, 31, 41".Protože n je ByVal, replace nelze změnit proměnné n přiřazením nové pole.Při replace vytvoří novou instanci array k a přiřadí místní proměnné a, ztratí odkaz na n předaná volající kód.Když členové zvýší a, místní pole k je ovlivněna.

Správný přístup: Chcete-li změnit základní proměnné prvku samotného, předat jej odkazem.Následující příklad ukazuje změny v prohlášení o replace , umožňuje nahradit jiným volající kód jednoho pole.

Public Sub replace(ByRef a() As Long)

Nelze definovat při přetížení

Pokud chcete definovat přetížené verzi postup, musíte použít stejný název, ale jiný podpis.Kompilátor nemůže rozlišit své prohlášení při přetížení se stejným podpisem, vygeneruje chybu.

Podpis postup je určen název procedury a seznam parametrů.Každý přetížením musí mít stejný název jako všechny ostatní přetížení, ale musí se liší od všech těchto alespoň jeden další komponenty podpis.Další informace naleznete v tématu Procedura přetížení (Visual Basic).

Následující položky, i když se seznam parametrů nejsou součástí podpisu postup:

  • Postup modifikátor klíčová slova, jako například Public, Shared, aStatic

  • Názvy parametrů

  • Parametr modifikátor klíčová slova, jako například ByRef aOptional

  • Datový typ návratové hodnoty (kromě pro převod operátor)

Postup nelze přetěžování změnou pouze jeden nebo více předchozích položek.

Správný přístup: Chcete-li definovat postup přetížení, musí se liší podpis.Protože je nutné použít stejný název, musí se liší počet, objednávky nebo datové typy parametrů.Obecný postup můžete měnit počet parametrů typu.V převodu operátor (CType – funkce (Visual Basic)), návratový typ se může lišit.

Přetěžování rozlišení s volitelnými a argumenty ParamArray

Pokud jsou přetížení postupem s jedním nebo více Nepovinné (Visual Basic) parametry nebo ParamArray (Visual Basic) parametr, je třeba se vyvarovat duplikování některého implicitní přetížení.Informace naleznete v části Aspekty přetížení procedur (Visual Basic).

Chybná verze přetížené procedury voláním

Pokud postup má několik verzí přetížené, by znát jejich seznamy parametrů a pochopit, jak Visual Basic řeší volání mezi přetížení.Jinak nelze volat při přetížení než zamýšlený.

Zjistíte přetížení, které chcete volat, pečlivě dodržovat následující pravidla:

  • Zadejte správný počet argumentů a ve správném pořadí.

  • Vaše argumenty v ideálním případě by měl mít přesně stejné typy dat jako odpovídající parametry.Typ dat jednotlivých argumentů musí v každém případě rozšířit, jeho odpovídající parametr.To platí i v Option Strict – příkaz nastavena na Off.Pokud při přetížení vyžaduje jakékoli zužujícího převodu ze seznamu argument, který přetěžování nejsou způsobilé být volána.

  • Pokud zadáte argumenty, které vyžadují rozšíření, proveďte jejich typy dat co nejblíže odpovídající datové typy parametrů.Pokud dva nebo více přetížení přijmout váš argument datové typy, kompilátor řeší volání k přetížení, který volá pro nejmenší množství rozšíření.

Můžete snížit pravděpodobnost odlišného typu dat pomocí CType – funkce (Visual Basic) převodu klíčové při přípravě své argumenty.

Selhání řešení přetížení

Při volání procedury přetížené kompilátor pokusí odstranit jeden přetížení.Pokud se řeší volání dané přetížení.Odstraňuje všechny přetížení nebo pokud jej nelze snížit způsobilé přetížení do jediného kandidáta, generuje chybu.

Následující příklad ukazuje proces řešení přetížení.

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)

První volání kompilátor eliminuje přetížení první typ první argument (Short) zúží odpovídajícího parametru typu (Byte).Pak díky třetí přetížení protože každý argument zadejte druhou přetížením (Short a Single) rozšiřuje odpovídající typu v třetí přetížením (Integer a Single).Druhý přetížení vyžaduje méně rozšiřování kompilátor používá pro volání.

V druhé volání kompilátor nelze vyloučit všechny přetížení na základě zúžení.To eliminuje třetí přetížení ze stejného důvodu jako v první volání může volat druhé přetížení s méně rozšiřování typy argumentů.Kompilátor nemůže však vyřešit mezi první a druhý přetížení.Každý má jeden parametr definovaný typ, který rozšiřuje odpovídající typu v druhé (Byte na Short, ale Single na Double).Kompilátor generuje proto při řešení přetížení.

Správný přístup: Chcete-li volání přetížené procedury bez nejednoznačnosti, pomocí CType – funkce (Visual Basic) odpovídající argument datové typy a typy parametrů.Následující příklad ukazuje volání z , vynutí rozlišení druhé přetížení.

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

Přetěžování rozlišení s volitelnými a argumenty ParamArray

Pokud dvě přetížení postup identickými podpisy s výjimkou, že je deklarována jako poslední parametr Nepovinné (Visual Basic) v jedné a ParamArray (Visual Basic) v jiných, kompilátor řeší volání postup podle nejbližší.Další informace naleznete v tématu Rozlišení přetěžování (Visual Basic).

Viz také

Koncepty

Procedury v jazyce Visual Basic

Sub – procedury (Visual Basic)

Procedury funkcí (Visual Basic)

Procedury vlastnosti (Visual Basic)

Procedury operátoru (Visual Basic)

Parametry a argumenty procedury (Visual Basic)

Procedura přetížení (Visual Basic)

Aspekty přetížení procedur (Visual Basic)

Rozlišení přetěžování (Visual Basic)