Rozsah v jazyce Visual Basic

Obor deklarovaného elementu je sada všech kódů, které na něj mohou odkazovat, aniž by kvalifikovaly jeho název nebo aby byly k dispozici prostřednictvím příkazu Imports (obor názvů a typ .NET). Prvek může mít obor na jedné z následujících úrovní:

Level Popis
Rozsah bloku K dispozici pouze v rámci bloku kódu, ve kterém je deklarován.
Rozsah procedury K dispozici pro veškerý kód v rámci procedury, ve které je deklarován
Rozsah modulu K dispozici pro veškerý kód v rámci modulu, třídy nebo struktury, ve které je deklarován
Obor názvů K dispozici pro veškerý kód v oboru názvů, ve kterém je deklarován

Tyto úrovně průběhu rozsahu od nejužšího (bloku) na nejširší (obor názvů), kde nejužší rozsah znamená nejmenší sadu kódu, která může odkazovat na prvek bez kvalifikace. Další informace naleznete v části Úrovně oboru na této stránce.

Určení oboru a definování proměnných

Rozsah prvku zadáte, když ho deklarujete. Obor může záviset na následujících faktorech:

  • Oblast (blok, procedura, modul, třída nebo struktura), ve které deklarujete prvek

  • Obor názvů obsahující deklaraci elementu

  • Úroveň přístupu, kterou deklarujete pro prvek

Při definování proměnných se stejným názvem, ale s jiným oborem používejte opatrně, protože to může vést k neočekávaným výsledkům. Další informace naleznete v tématu Odkazy na deklarované elementy.

Úrovně rozsahu

Programovací prvek je k dispozici v celé oblasti, ve které ji deklarujete. Veškerý kód ve stejné oblasti může odkazovat na prvek bez kvalifikace jeho názvu.

Obor bloku

Blok je sada příkazů uzavřených v iniciacích a ukončovacích deklaracích, například následující:

  • Do a Loop

  • For [Each] a Next

  • If a End If

  • Select a End Select

  • SyncLock a End SyncLock

  • Try a End Try

  • While a End While

  • With a End With

Pokud deklarujete proměnnou v rámci bloku, můžete ji použít pouze v rámci daného bloku. V následujícím příkladu je rozsah celočíselné proměnné cube blokem mezi If a End If, a již nelze odkazovat na cube , když provádění projde z bloku.

If n < 1291 Then
    Dim cube As Integer
    cube = n ^ 3
End If

Poznámka:

I když je rozsah proměnné omezen na blok, jeho životnost je stále stejná jako celý postup. Pokud během postupu zadáte blok více než jednou, každá proměnná bloku si zachová předchozí hodnotu. Aby se v takovém případě zabránilo neočekávaným výsledkům, je vhodné inicializovat blokové proměnné na začátku bloku.

Rozsah procedury

Prvek deklarovaný v rámci procedury není k dispozici mimo tuto proceduru. Pouze procedura, která obsahuje deklaraci, ji může použít. Proměnné na této úrovni se také označují jako místní proměnné. Deklarujete je pomocí příkazu Dim s statickým klíčovým slovem nebo bez nich.

Rozsah postupu a bloku úzce souvisí. Pokud deklarujete proměnnou uvnitř procedury, ale mimo jakýkoli blok v rámci tohoto postupu, můžete si proměnnou představit jako rozsah bloku, kde blok je celý postup.

Poznámka:

Všechny místní prvky, i když jsou Static proměnné, jsou soukromé pro proceduru, ve které se zobrazují. Nelze deklarovat žádný prvek pomocí veřejného klíčového slova v rámci procedury.

Obor modulu

Pro usnadnění činnosti platí stejná úroveň modulu s jedním termínem pro moduly, třídy a struktury. Prvky na této úrovni můžete deklarovat umístěním prohlášení mimo jakýkoli postup nebo blok, ale v rámci modulu, třídy nebo struktury.

Při vytváření deklarace na úrovni modulu určuje úroveň přístupu, kterou zvolíte. Obor názvů, který obsahuje modul, třídu nebo strukturu, má vliv také na obor.

Prvky, pro které deklarujete úroveň privátního přístupu, jsou k dispozici pro všechny procedury v daném modulu, ale ne pro žádný kód v jiném modulu. Příkaz Dim na úrovni modulu je výchozí, Private pokud nepoužíváte žádná klíčová slova na úrovni přístupu. Obor a úroveň přístupu ale můžete zviditelnit použitím klíčového PrivateDim slova v příkazu.

V následujícím příkladu mohou všechny procedury definované v modulu odkazovat na řetězcovou proměnnou strMsg. Při volání druhé procedury se zobrazí obsah proměnné strMsg řetězce v dialogovém okně.

' Put the following declaration at module level (not in any procedure).
Private strMsg As String
' Put the following Sub procedure in the same module.
Sub initializePrivateVariable()
    strMsg = "This variable cannot be used outside this module."
End Sub
' Put the following Sub procedure in the same module.
Sub usePrivateVariable()
    MsgBox(strMsg)
End Sub

Obor názvů

Pokud deklarujete prvek na úrovni modulu pomocí klíčového slova Friend nebo Public , bude k dispozici pro všechny procedury v celém oboru názvů, ve kterém je prvek deklarován. S následující změnou předchozího příkladu lze řetězcovou proměnnou strMsg odkazovat kódem kdekoli v oboru názvů jeho deklarace.

' Include this declaration at module level (not inside any procedure).
Public strMsg As String

Obor názvů zahrnuje vnořené obory názvů. Prvek dostupný z oboru názvů je také k dispozici z libovolného oboru názvů vnořeného uvnitř daného oboru názvů.

Pokud projekt neobsahuje žádné příkazyoboru názvů, všechno v projektu je ve stejném oboru názvů. V tomto případě si obor názvů můžete představit jako obor projektu. Public elementy v modulu, třídě nebo struktuře jsou také k dispozici pro všechny projekty, které odkazují na jejich projekt.

Volba rozsahu

Při deklaraci proměnné byste při výběru oboru měli mít na paměti následující body.

Výhody místních proměnných

Místní proměnné jsou dobrou volbou pro jakýkoli druh dočasného výpočtu z následujících důvodů:

  • Zabránění konfliktům názvů Názvy místních proměnných nejsou náchylné ke konfliktu. Můžete například vytvořit několik různých postupů obsahujících proměnnou s názvem intTemp. Pokud je každý intTemp deklarován jako místní proměnná, každý postup rozpozná pouze vlastní verzi intTemp. Každá procedura může změnit hodnotu v jejím místním prostředí intTemp , aniž by to mělo vliv na intTemp proměnné v jiných procedurách.

  • Spotřeba paměti. Místní proměnné spotřebovávají paměť pouze v době, kdy je jejich postup spuštěný. Jejich paměť se uvolní, když se procedura vrátí do volajícího kódu. Sdílené a statické proměnné naopak spotřebovávají prostředky paměti, dokud se aplikace nezastaví, takže je používejte jenom v případě potřeby. Proměnné instance spotřebovávají paměť, zatímco jejich instance stále existuje, což je méně efektivní než místní proměnné, ale potenciálně efektivnější než Shared proměnné nebo Static proměnné.

Minimalizace rozsahu

Obecně platí, že při deklarování jakékoli proměnné nebo konstanty je vhodné programovat obor co nejužší (obor bloku je nejužší). To pomáhá šetřit paměť a minimalizovat pravděpodobnost kódu chybně odkazující na nesprávnou proměnnou. Podobně byste měli deklarovat proměnnou jako statickou pouze v případě, že je nutné zachovat její hodnotu mezi voláními procedur.

Viz také