programowanieBackend-developer (Visual Basic)

Jak zaimplementować słowniki (Dictionary(Of TKey, TValue)) w Visual Basic, jakie operacje są dostępne, jakie pułapki występują przy uzyskiwaniu wartości dla nieistniejącego klucza?

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź.

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:

  • Szybki dostęp po kluczu (haszowanie)
  • Jawne sprawdzenie istnienia klucza zapobiega błędowi
  • Usuwanie i zmiana wartości na podstawie klucza są realizowane poprzez Remove i indeksator

Pytania z pułapką.

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.

Typowe błędy i antywzorce

  • Dostęp do nieistniejącego klucza przez indeksator bez sprawdzenia
  • Duplikowanie kluczy przez Add (występuje ArgumentException)
  • Ignorowanie zwrotu z TryGetValue

Przykład z życia

Negatywny przypadek

Dostęp do słownika przez indeks bez wcześniejszego sprawdzenia duplikuje się w różnych miejscach — okresowe upadki programu.

Zalety:

  • Kod bardziej zwarty

Wady:

  • Niestabilność aplikacji, trudno wychwycić błędy

Pozytywny przypadek

Powszechne stosowanie TryGetValue, wszystkie zapytania są zabezpieczone, przypadki braku klucza są logicznie przetwarzane.

Zalety:

  • Stabilne zachowanie, brak wyjątków

Wady:

  • Konieczność wprowadzenia zmiennych out dla wartości