Sdílet prostřednictvím


Pole v jazyce Visual Basic

Pole je sada hodnot, které logicky vzájemně souvisí, jako je počet studentů v každé třídě gymnázia.

Pomocí pole můžete odkazovat na tyto související hodnoty se stejným názvem a použít číslo, které se nazývá index nebo dolní index pro jejich oddělení.Jednotlivé hodnoty se nazývají prvky pole.Jsou souvislé z indexu 0 až k nejvyšší hodnotě indexu.

Na rozdíl od pole, proměnná, která bude obsahovat jedinou hodnotu, se nazývá skalární proměnná.

V tomto tématu

  • Prvky pole v jednoduchém poli

  • Vytvoření pole

  • Deklarace pole

  • Ukládání hodnot v poli

  • Vyplnění pole počátečními hodnotami

    • Literály vnořeného pole
  • Procházení skrze pole

  • Pole jako návratové hodnoty a parametry

  • Vícenásobná pole

  • Pole nulové délky

  • Velikost pole

  • Typy polí a další typy

  • Kolekce jako alternativu k polím

Prvky pole v jednoduchém poli

Následující příklad deklaruje proměnnou pole pro uchování počtu studentů z každého stupně ve škole gramatiky.

Dim students(6) As Integer

Pole students v předchozím příkladu obsahuje sedm prvků.Indexy prvků v rozsahu od 0 do 6.Toto pole je jednodušší než deklarování sedmi proměnných.

Následující ilustrace znázorňuje pole students.Pro každý element pole:

  • Index prvku představuje stupeň (index 0 představuje mateřské školy).

  • Hodnota, která je obsažena v elementu, představuje počet studentů v této platové třídě.

Elementy pole "studenti"

Obrázek pole zobrazující počet studentů

Následující příklad ukazuje, jak odkazovat na první, druhý a poslední prvek pole students.

Dim kindergarten As Integer = students(0)
Dim firstGrade As Integer = students(1)
Dim sixthGrade As Integer = students(6)
MsgBox("Students in kindergarten = " & CStr(kindergarten))
MsgBox("Students in first grade = " & CStr(firstGrade))
MsgBox("Students in sixth grade = " & CStr(sixthGrade))

S použitím pouze názvu proměnné pole bez indexů lze na pole odkazovat jako na celek.

Pole students v předchozím příkladu používá jeden rejstřík a má být jednorozměrné.Pole, které používá více než jeden index nebo dolní index, se nazývá multidimenzionální pole.Více informací naleznete v dalších částech tohoto tématu a v části Rozměry pole v jazyce Visual Basic.

Vytvoření pole

Můžete definovat velikost pole několika způsoby.Můžete zadat velikost při deklaraci pole, jak ukazuje následující příklad.

Dim cargoWeights(10) As Double 
Dim atmospherePressures(2, 2, 4, 10) As Short 
Dim inquiriesByYearMonthDay(20)()() As Byte

Můžete také použít klauzuli New k zadání velikosti pole při jeho vytvoření, jak ukazuje následující příklad.

cargoWeights = New Double(10) {}
atmospherePressures = New Short(2, 2, 4, 10) {}
inquiriesByYearMonthDay = New Byte(20)()() {}

Pokud máte existují pole, můžete změnit jeho velikost pomocí příkazu Redim.Můžete zadat, aby příkaz Redim zachovával hodnoty, které jsou v poli, nebo můžete určit, že vytvoří prázdné pole.Následující příklad ukazuje různá použití příkazu Redim pro změnu velikosti existujícího pole.

' Assign a new array size and retain the current element values. 
ReDim Preserve cargoWeights(20)
' Assign a new array size and retain only the first five element values. 
ReDim Preserve cargoWeights(4)
' Assign a new array size and discard all current element values. 
ReDim cargoWeights(15)

Další informace naleznete v tématu ReDim – příkaz (Visual Basic).

Deklarace pole

Proměnná pole se deklaruje stejným způsobem jako jakákoli jiná proměnná – pomocí příkazu Dim.Sledujete typ nebo název proměnné pomocí jednoho nebo více párů závorek k označení, že bude obsahovat pole spíše než skalární hodnotu, což je proměnná, která obsahuje pouze jednu hodnotu.

Po deklaraci pole můžete definovat jeho velikost pomocí ReDim – příkaz (Visual Basic).

Následující příklad deklaruje proměnnou jednorozměrného pole přidáním páru závorek za typ.Příklad také určuje dimenze pole pomocí ReDim – příkaz (Visual Basic).

' Declare a one-dimensional array. 
Dim cargoWeights As Double()

' Dimension the array. 
ReDim cargoWeights(15)

Následující příklad deklaruje proměnnou vícerozměrného pole přidáním páru závorek za typ a umístěním čárky v závorkách pro oddělení dimenzí.Příklad také určuje dimenze pole pomocí ReDim – příkaz (Visual Basic).

' Declare a multidimensional array. 
Dim atmospherePressures As Short(,,,)

' Dimension the array. 
ReDim atmospherePressures(1, 2, 3, 4)

Pokud chcete deklarovat proměnnou vícenásobného pole, přidejte dvojici závorek za název proměnné pro každou úroveň vnořeného pole.

Dim inquiriesByYearMonthDay()()() As Byte

Předchozí příklady deklarují proměnné pole, ale pole k nim nepřiřazují.Přesto musíte vytvořit matici, inicializovat ji a přiřadit proměnné.

Ukládání hodnot v poli

Získáte přístup do každého umístění v poli pomocí indexu typu Integer.Můžete uložit a načíst hodnoty v matici odkazováním na umístění jednotlivých polí pomocí indexu uvedeného v závorkách.Indexy pro vícerozměrná pole jsou odděleny čárkami (,).Budete potřebovat jeden index pro každou dimenzi pole.Následující příklad ukazuje některé příkazy, které ukládají hodnoty do polí.

Dim i = 4
Dim j = 2

Dim numbers(10) As Integer 
Dim matrix(5, 5) As Double

numbers(i + 1) = 0
matrix(3, j * 2) = j

Následující příklad ukazuje některé příkazy, které získávají hodnoty z polí.

Dim v = 2
Dim i = 1
Dim j = 1
Dim k = 1
Dim wTotal As Double = 0.0
Dim sortedValues(5), rawValues(5), estimates(2, 2, 2) As Double 
Dim lowestValue = sortedValues(0)
wTotal += (rawValues(v) ^ 2)
Dim firstGuess = estimates(i, j, k)

Vyplnění pole počátečními hodnotami

Pomocí literálového pole můžete vytvořit pole, které obsahuje počáteční sadu hodnot.Literál pole obsahuje seznam hodnot oddělených čárkami, které jsou uzavřeny v závorkách ({}).

Při vytváření pole pomocí literálu pole můžete zadat typ pole nebo typ pole můžete určit pomocí odvození typu proměnné.Následující kód ukazuje obě možnosti.

Dim numbers = New Integer() {1, 2, 4, 8}
Dim doubles = {1.5, 2, 9.9, 18}

Při použití odvození typu je typ pole určen dominantním typem v seznamu hodnot dodaném pro literál pole.Dominantní typ je jedinečný typ na který lze rozšířit všechny ostatní typy pole literálu.Pokud nelze určit tento jedinečný typ, dominantní typ je jedinečný typ, na který můžete zúžit všechny typy v poli.Pokud ani jeden z těchto jedinečných typů nelze určit, dominantní typ je Object.Například pokud seznam hodnot, který je zadán do pole literálu, obsahuje hodnoty typu Integer, Long a Double, výsledné pole je typu Double.Integer i Long se rozšiřují pouze na Double.Proto je Double dominantní typ.Další informace naleznete v tématu Rozšíření a zúžení převodů (Visual Basic).Tato pravidla odvození se vztahují na typy, které jsou odvozeny pro pole, která představují lokální proměnné, které jsou definovány v členovi třídy.Přestože lze použít literály pole při vytváření proměnných na úrovni třídy, nelze použít odvození typu na úrovni třídy.V důsledku toho literály pole, které jsou určeny na úrovni třídy, odvozují hodnoty, které jsou dodávány pro pole literálu jako typ Object.

Můžete explicitně určit typ elementů v matici, která je vytvořena pomocí literály pole.V tomto případě se musí hodnoty v poli literálu rozšířit na typ prvků v poli.Následující příklad kódu vytvoří pole typu Double ze seznamu celých čísel.

Dim values As Double() = {1, 2, 3, 4, 5, 6}

Literály vnořeného pole

Můžete vytvořit vícedimenzionální pole pomocí literál vnořeného pole.Literály vnořeného pole musí mít dimenzi a číslo dimenze nebo hodnost, která je v souladu s výsledným polem.Následující příklad kódu vytvoří dvourozměrné pole celých čísel pomocí literálového pole.

Dim grid = {{1, 2}, {3, 4}}

V předchozím příkladu by došlo k chybě, pokud by neodpovídal počet prvků v literálech vnořeného pole.Pokud explicitně deklarujete proměnnou pole, aby byla jiná než dvojrozměrná, také dojde k chybě.

[!POZNÁMKA]

Chybám se můžete vyhnout, když zadáte literály vnořeného pole různých dimenzí uzavřením literál vnitřní pole do závorek.Závorky vynutí vyhodnocení literálního výrazu pole a výsledné hodnoty se používají u vnějšího literálu pole, jak ukazuje následující kód.

Dim values = {({1, 2}), ({3, 4, 5})}

Při vytváření vícedimenzionálního pole pomocí literál vnořeného pole můžete použít odvození typu.Při použití odvození typu je odvozený typ dominantní typ pro všechny hodnoty ve všech literálech pole úrovně vnoření.Následující příklad kódu vytvoří dvourozměrné pole typu Double z hodnot, které jsou typu Integer a Double.

Dim a = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Další příklady naleznete v tématu Postupy: Inicializace proměnné pole v jazyce Visual Basic.

Procházení skrze pole

Při iteraci pole máte přístup ke každému elementu v poli od nejnižšího indexu k nejvyššímu.

Následující příklad provede iteraci jednorozměrového pole použitím příkazu For...Next – příkaz (Visual Basic).Metoda GetUpperBound vrátí nejvyšší hodnotu, kterou index může mít.Nejnižší hodnota indexu je vždy 0.

Dim numbers = {10, 20, 30}

For index = 0 To numbers.GetUpperBound(0)
    Debug.WriteLine(numbers(index))
Next 
' Output: 
'  10 
'  20 
'  30

Následující příklad provede iteraci multidimenzionálního pole použitím příkazu For...Next.Metoda GetUpperBound má parametr, který určuje dimenzi.GetUpperBound(0) vrátí hodnotu vysokého indexu pro první dimenzi a GetUpperBound(1) vrátí hodnotu vysokého indexu druhé dimenze.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For index0 = 0 To numbers.GetUpperBound(0)
    For index1 = 0 To numbers.GetUpperBound(1)
        Debug.Write(numbers(index0, index1).ToString & " ")
    Next
    Debug.WriteLine("")
Next 
' Output  
'  1 2  
'  3 4  
'  5 6

Následující příklad provede iteraci jednorozměrového pole použitím příkazu For Each...Next – příkaz (Visual Basic).

Dim numbers = {10, 20, 30}

For Each number In numbers
    Debug.WriteLine(number)
Next 
' Output: 
'  10 
'  20 
'  30

Následující příklad provede iteraci multidimenzionálního pole použitím příkazu For Each...Next.Máte však větší kontrolu nad elementy vícerozměrného pole při použití vnořeného prohlášení For…Next, stejně jako v předchozím příkladu, místo prohlášení For Each…Next.

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For Each number In numbers
    Debug.WriteLine(number)
Next 
' Output: 
'  1 
'  2 
'  3 
'  4 
'  5 
'  6

Pole jako návratové hodnoty a parametry

Chcete-li vrátit pole z procedury Function, zadejte datový typ pole a počet dimenzí jako návratový typ Function – příkaz (Visual Basic).V rámci této funkce deklarujte místní proměnnou pole stejným datovým typem a počtem dimenzí.V Return – příkaz (Visual Basic) zahrňte proměnnou místního pole bez závorek.

Chcete-li určit pole jako parametr pro postup Sub nebo Function, definujte parametr jako pole se zadaným datovým polem a počtem dimenzí.Při volání do procedury odešlete proměnné pole se stejný typem dat a počtem dimenzí.

V následujícím příkladu funkce GetNumbers vrátí Integer().Tento typ pole je jednorozměrné pole typu Integer.Procedura ShowNumbers přijímá argument Integer().

Public Sub Process()
    Dim numbers As Integer() = GetNumbers()
    ShowNumbers(numbers)
End Sub 

Private Function GetNumbers() As Integer()
    Dim numbers As Integer() = {10, 20, 30}
    Return numbers
End Function 

Private Sub ShowNumbers(numbers As Integer())
    For index = 0 To numbers.GetUpperBound(0)
        Debug.WriteLine(numbers(index) & " ")
    Next 
End Sub 

' Output: 
'   10 
'   20 
'   30

V následujícím příkladu funkce GetNumbersMultiDim vrátí Integer(,).Tento typ pole je dvojrozměrné pole typu Integer. Procedura ShowNumbersMultiDim přijímá argument Integer(,).

Public Sub ProcessMultidim()
    Dim numbers As Integer(,) = GetNumbersMultidim()
    ShowNumbersMultidim(numbers)
End Sub 

Private Function GetNumbersMultidim() As Integer(,)
    Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}
    Return numbers
End Function 

Private Sub ShowNumbersMultidim(numbers As Integer(,))
    For index0 = 0 To numbers.GetUpperBound(0)
        For index1 = 0 To numbers.GetUpperBound(1)
            Debug.Write(numbers(index0, index1).ToString & " ")
        Next
        Debug.WriteLine("")
    Next 
End Sub 

' Output   
'  1 2   
'  3 4   
'  5 6

Vícenásobná pole

Pole, které obsahuje jiná pole jako prvky, se nazývá pole polí nebo vícenásobné pole.Vícenásobné pole a každý prvek ve vícenásobném poli může mít jednu nebo více dimenzí.Struktura dat ve vaší aplikaci je někdy dvourozměrná, ale nemá tvar obdélníku.

Následující příklad obsahuje celou řadu měsíců, jejichž každým prvkem je pole dnů.Vzhledem k tomu, že různé měsíce mají různý počet dnů, elementy netvoří obdélníkové dvojrozměrné pole.Proto se používá vícenásobné pole namísto multidimenzionálního pole.

' Declare the jagged array. 
' The New clause sets the array variable to a 12-element 
' array. Each element is an array of Double elements. 
Dim sales()() As Double = New Double(11)() {}

' Set each element of the sales array to a Double 
' array of the appropriate size. 
For month As Integer = 0 To 11
    Dim days As Integer =
        DateTime.DaysInMonth(Year(Now), month + 1)
    sales(month) = New Double(days - 1) {}
Next month

' Store values in each element. 
For month As Integer = 0 To 11
    Dim upper = sales(month).GetUpperBound(0)
    For day = 0 To upper
        sales(month)(day) = (month * 100) + day
    Next 
Next

Pole nulové délky

Pole, které neobsahuje žádné prvky, se také nazývá pole nulové délky.Proměnná, která obsahuje pole nulové délky, nemá hodnotu Nothing.Chcete-li vytvořit pole, které nemá žádné elementy, deklarujte jeden z rozměrů pole jako hodnotu -1, jak ukazuje následující příklad.

Dim twoDimensionalStrings(-1, 3) As String

Může být nutné vytvořit pole nulové délky za následujících okolností:

  • Bez riskování výjimky NullReferenceException musí kód přistupovat k prvkům třídy Array, jako jsou Length nebo Rank nebo volat funkci Visual Basic, jako je UBound.

  • Chcete zjednodušit časově náročný kód tím, že nezkontrolujete Nothing jako speciální případ.

  • Kód spolupracuje s programovací rozhraním aplikace (API), které vyžaduje předání pole nulové délky do jednoho nebo více postupů nebo vrátí pole nulové délky z jednoho nebo více postupů.

Velikost pole

Velikost pole je produktem délek všech jeho rozměrů.Představuje celkový počet prvků, které jsou aktuálně obsaženy v poli.

Následující příklad deklaruje třídimenzionální pole.

Dim prices(3, 4, 5) As Long

Celková velikost pole v proměnné prices je (3 + 1) x (4 + 1) x (5 + 1) = 120.

Velikost pole můžete najít pomocí vlastnosti Length.Délku každé dimenze vícerozměrného pole můžete najít pomocí metody GetLength.

Můžete změnit velikost proměnné pole pomocí přiřazení nového objektu pole nebo pomocí výrazu ReDim.

Při zacházení s velikostí pole je nutné mít na paměti několik věcí.

Délka dimenze

Index každé dimenze je založen na 0, což znamená, že má rozsah od 0 po horní mez.Délka dané dimenze je tedy o 1 větší než deklarovaná horní mez pro tuto dimenzi.

Omezení délky

Délka každé dimenze v poli je omezena na maximální hodnotu datového typu Integer, který je (2 ^ 31) - 1.Celková velikost pole je také omezena pamětí, která je k dispozici v systému.Při pokusu o inicializaci pole, který překračuje množství dostupné paměti RAM, modul CLR vyvolá výjimku OutOfMemoryException.

Velikost a velikost elementu

Velikost tohoto pole je nezávislý na typu dat z jeho prvků.Velikost vždy představuje celkový počet prvků, nikoli počet bajtů, které spotřebovávají ve skladu.

Spotřeba paměti

Není bezpečné přicházet se závěry týkajícími se toho, jak je pole uloženo v paměti.Skladování závisí na platformách s různou šířkou dat, takže stejné pole může spotřebovávat více paměti na 64bitové verzi systému, než v 32bitové.V závislosti na konfiguraci systému při inicializaci pole, modul CLR (common language runtime) může přiřadit úložiště, aby zabalil elementy co nejblíže k sobě nebo je zarovnal na hranice fyzických hardwarových vazeb.Pole také vyžaduje režii úložiště pro informace o ovládacím prvku a tato režie se zvyšuje s každou přidanou dimenzi.

Typy polí a další typy

Každé pole má typ dat, ale liší se od typu dat jeho elementů.Neexistuje žádný jednotlivý typ dat pro všechna pole.Místo toho je určen datový typ pole podle počtu rozměrů, nebo pořadí polí a datového typu prvků v poli.Dvě proměnné pole jsou považovány za stejný datový typ, pouze pokud mají stejné pořadí a jejich elementy mají stejný datový typ.Délky dimenzí v poli neovlivňují datový typ pole.

Každé pole dědí z třídy Array a můžete deklarovat proměnnou typu Array, ale nemůžete vytvořit pole typu Array.Také ReDim – příkaz (Visual Basic) nemůže pracovat na proměnné deklarované jako typ Array.Z těchto důvodů a pro bezpečnost typů je vhodné deklarovat každé pole jako specifický typ, jako například Integer v předchozím příkladu.

Datový typ pole nebo jeho elementů můžete najít několika způsoby.

  • Můžete volat metodu Object.GetType v proměnné k získání objektu Type pro typ run-time proměnné.Objekt Type obsahuje rozsáhlé informace ve vlastnostech a metodách.

  • Můžete předat proměnnou do funkce TypeName pro příjem String obsahujícího název typu v době spuštění.

  • Proměnnou můžete předat do funkce VarType pro příjem hodnoty VariantType představující klasifikaci typu proměnné.

Následující příklad volá funkci TypeName, aby určil typ pole a typ prvků v poli.Typ pole je Integer(,) a prvky pole jsou typu Integer.

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {}
MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))

Kolekce jako alternativa k polím

Pole jsou zvláště užitečná pro vytváření a práci s pevným počtem silně typovaných objektů.Kolekce poskytují pružnější způsob práce se skupinami objektů.Na rozdíl od pole skupiny objektů, se kterými pracujete, mohou dynamicky růst a zmenšovat se podle potřeb změn aplikace.

Pokud potřebujete změnit velikost pole, musíte použít ReDim – příkaz (Visual Basic).Pokud to provedete, Visual Basic vytvoří nové pole a uvolní předchozí pole k dispozici.Zabírá to čas spuštění.Proto, pokud se počet položek, se kterými pracujete, často mění nebo nelze předvídat maximální počet položek, které potřebujete, můžete získat lepší výkon pomocí kolekce.

Pro některé kolekce můžete přiřadit klíč k libovolnému objektu, který vložíte do kolekce, takže můžete snadno obnovit objekt pomocí klíče.

Pokud kolekce obsahuje prvky pouze jednoho typu dat, můžete použít jednu ze tříd v oboru názvů System.Collections.Generic.Obecná kolekce vynucuje bezpečnost typů, aby do ní nebylo možné přidat žádný jiný datový typ.Při načítání elementu z obecné kolekce není nutné zjistit jeho typ dat, nebo ho převádět.

Další informace o kolekcích viz Kolekce (C# and Visual Basic).

Příklad

V následujícím příkladu používá obecná třída .NET Framework List k vytvoření seznamu kolekce objektů Customer.

' Define the class for a customer. 
Public Class Customer
    Public Property Name As String 
    ' Insert code for other members of customer structure. 
End Class 

' Create a module-level collection that can hold 200 elements. 
Public CustomerList As New List(Of Customer)(200)

' Add a specified customer to the collection. 
Private Sub AddNewCustomer(ByVal newCust As Customer)
    ' Insert code to perform validity check on newCust.
    CustomerList.Add(newCust)
End Sub 

' Display the list of customers in the Debug window. 
Private Sub PrintCustomers()
    For Each cust As Customer In CustomerList
        Debug.WriteLine(cust)
    Next cust
End Sub

Prohlášení kolekce CustomerFile určuje, zda může obsahovat pouze prvky typu Customer.Také poskytuje počáteční kapacitu 200 prvků.Postup AddNewCustomer kontroluje platnost nového prvku a poté jej přidá do kolekce.Postup PrintCustomers používá smyčku For Each k procházení kolekce a zobrazení jeho prvků.

Příbuzná témata

Termín

Definice

Rozměry pole v jazyce Visual Basic

Popisuje pořadí a rozměry v polích.

Postupy: Inicializace proměnné pole v jazyce Visual Basic

Popisuje, jak naplnit pole počátečními hodnotami.

Postupy: Řazení pole v jazyce Visual Basic

Popisuje, jak prvky pole seřadit podle abecedy.

Postupy: Přiřazení jednoho pole ke druhému (Visual Basic)

Popisuje pravidla a postup pro přiřazení pole do jiné proměnné pole.

Řešení potíží s poli (Visual basic)

Tento článek popisuje některé běžné problémy, které vznikají při práci s poli.

Viz také

Referenční dokumentace

Dim – příkaz (Visual Basic)

ReDim – příkaz (Visual Basic)

Array