Saya menemukan jawaban ini di StackOverflow tempo hari dan ingin memberikan perhatian padanya (penekanan pada saya):
Saya mengalami masalah ini saat melakukan debug ketika Saya memiliki jam tangan yang mencoba mengembalikan item kunci yang "hilang" . Sebenarnya, debugging frustrasi lebih lanjut memiliki masalah yang sama ketika saya benar-benar memiliki arloji untuk [scriptingdictonaryObject].exists() condtional); Saya menyarankan agar kunci "hilang" ditambahkan karena jam tangan . Saat saya melepas arloji dan malah membuat lembar kerja sementara untuk menyalin larik saat dijalankan, kunci yang tidak diinginkan tidak lagi ditambahkan.Objek kamus menambahkan item sebelum .add() dipanggilSaya menggunakan objek kamus dari pustaka MS Scripting Runtime untuk menyimpan serangkaian larik dan melakukan operasi pada sel larik jika diperlukan. Ada for loop untuk melewati proses... Stack Overflowriddley_w
Apa yang terjadi di sini?
Salah satu "fitur" dari objek Kamus adalah bahwa objek itu akan secara implisit buat item baru tanpa perlu memanggil metode .Add secara eksplisit . Apa perbedaan antara implisit dan eksplisit?
Catatan:Penggunaan awal objek Dictionary memerlukan referensi ke "Microsoft Scripting Runtime" (detail di sini).
Dim MyDict As New Dictionary
'Explicit add
MyDict.Add "KeyA", "Item A"
'Implicit add
MyDict.Item("KeyB") = "Item B"
Debug.Print MyDict("KeyA"); vbNewLine; MyDict("KeyB")
Inilah bagian dokumentasi yang relevan mengenai implisit pembuatan kunci:
Keterangan
Jika kunci tidak ditemukan saat mengubah item , kunci new baru dibuat dengan item baru yang ditentukan . Jika kunci tidak ditemukan saat mencoba mengembalikan item yang ada, kunci baru dibuat dan item terkait dibiarkan kosong.
Mereproduksi masalah
Mari kita ulangi masalahnya untuk melihat dengan tepat ke mana arahnya.
Perilaku yang diharapkan
Buat contoh rutin berikut:
Sub WatchOut()
Dim MyDict As Dictionary
Set MyDict = New Dictionary
Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub
Jalankan rutinitas di atas dari jendela langsung dan itu akan mengembalikan False:
WatchOut
KeyA exists? False
Tambahkan jam tangan
Sekarang, mari tambahkan arloji dari item "KeyA":
Mari kita coba menjalankan WatchOut rutin lagi:
WatchOut
KeyA exists? False
Sejauh ini baik. Mungkin ini bukan masalah.
Langkah melalui kode
Mari tambahkan Berhenti pernyataan untuk memaksa kode untuk memecahkan:
Sub WatchOut()
Dim MyDict As Dictionary
Set MyDict = New Dictionary
Stop
Debug.Print "KeyA exists? "; MyDict.Exists("KeyA")
End Sub
Sekarang, mari kita coba menjalankan WatchOut rutin:
WatchOut
KeyA exists? True
Ah! Kombinasi jam tangan dan membobol debugger sudah cukup untuk memaksa "bug" muncul. Saya memasukkan bug dalam tanda kutip menakut-nakuti karena itu sebenarnya perilaku yang diharapkan untuk debugger. Tapi itu hampir pasti perilaku yang tidak terduga bagi pengembang.
(Perhatikan bahwa tidak ada yang istimewa dari Stop perintah yang menyebabkan perilaku ini. Anda dapat menghapus Berhenti baris dan setel breakpoint pada kode dan perilaku yang sama akan terjadi.)
Anda dapat melihat di mana hal semacam ini dapat menyebabkan Anda mencabut rambut Anda saat debugging. Kapan pun perilaku program Anda berbeda saat berjalan normal versus saat men-debug, Anda bisa melakukan satu sesi debug yang memberatkan.
Ringkasan
Langkah-langkah untuk mereproduksi masalah:
- Buat Arloji untuk item Kamus tertentu
- Mendobrak debugger saat menjalankan kode
Ini mungkin hanya akan membantu satu atau dua pengembang. Tapi itu berpotensi menghemat jam pengembang tersebut frustrasi. Dan, jika boleh jujur, saya kemungkinan besar akan menjadi salah satu pengembang tersebut;-).