Historia pytania
Od momentu pojawienia się .NET Framework Visual Basic zyskał typowo bezpieczną i wydajną strukturę przechowywania par klucz-wartość — Dictionary(Of TKey, TValue). To standardowy kontener asocjacyjny dla szybkiego wyszukiwania.
Problem
Praca z słownikiem często powoduje błędy: próba uzyskania dostępu do wartości przez klucz, który nie istnieje, prowadzi do wyjątku. Również często mylone są operacje dodawania, zmiany i dodawania nowych wartości.
Rozwiązanie
Aby uzyskać dostęp do wartości, używa się indeksatora lub metod TryGetValue, ContainsKey. Aby uniknąć wyjątku KeyNotFoundException, zawsze wykonuj jawne sprawdzenie:
Przykład kodu:
Dim dict As New Dictionary(Of String, Integer)() dict.Add("jeden", 1) dict("dwa") = 2 ' Dodanie nowej pary If dict.ContainsKey("trzy") Then Console.WriteLine(dict("trzy")) ' Nie spowoduje błędu Else Console.WriteLine("Klucz nie został znaleziony") End If Dim value As Integer = 0 If dict.TryGetValue("jeden", value) Then Console.WriteLine(value) End If
Kluczowe cechy:
Czy to prawda, że dict("klucz") zawsze dodaje nową parę klucz-wartość?
Nie. Jeśli klucz istnieje, wartość jest aktualizowana. Jeśli nie istnieje — para jest dodawana. Aby dodać z błędem w przypadku istnienia klucza — użyj metody Add.
Czy TryGetValue spowoduje wyjątek, jeśli klucz nie istnieje?
Nie. Zwróci False, nie wywołując wyjątku i nie zmieniając value. To bezpieczny sposób uzyskiwania dostępu.
Czy można przechowywać w Dictionary typy wartości (np. Integer) jako TValue i jednocześnie otrzymywać null dla brakującego klucza?
Nie. Dla typu wartości zwracana jest wartość domyślna dla tego typu (0 dla Integer), ale dostęp przez indeksator wciąż wywoła wyjątek przy braku klucza.
Dostęp do słownika przez indeks bez wcześniejszego sprawdzenia duplikuje się w różnych miejscach — okresowe upadki programu.
Zalety:
Wady:
Powszechne stosowanie TryGetValue, wszystkie zapytania są zabezpieczone, przypadki braku klucza są logicznie przetwarzane.
Zalety:
Wady: