Visual Basicでは、コレクション(配列、リスト、辞書など)はインデックスによるアクセスとイテレータを使ったアクセス(たとえば、For Eachを通じて)をサポートしています。言語の歴史において、標準配列の最初の要素はインデックス0でしたが、VB6との互換性のために1から宣言された配列も存在します。これによりアクセスの順序や可能なエラーに影響します。また、Dictionary型のコレクションはキーによる検索をサポートしていますが、存在しない要素へのアクセスを試みると例外が発生する可能性があります。
アクセスの問題は、構文の違いやインデクサの動作の特性、すべてのコレクションが要素がない場合にNullまたはNothingを返さないことにあります。多くの場合、例外が発生することが起こります。ループを使用する場合は、インデックスの範囲を遵守し、コレクションのサイズを事前に確認することが重要です。
安全なアクセスのための解決策には、長さのチェック、指定辞書のContainsKeyまたはTryGetValueメソッドの使用、For Eachを使用した要素の列挙が含まれます。この方法では、存在する値へのアクセスが行われ、範囲外に出るリスクがありません。
コード例:
Dim list As New List(Of String)({"a", "b", "c"}) For i As Integer = 0 To list.Count - 1 Console.WriteLine(list(i)) Next ' イテータを使ったループ: For Each item In list Console.WriteLine(item) Next ' Dictionaryへの安全なアクセス Dim dict As New Dictionary(Of Integer, String) dict(1) = "one" If dict.ContainsKey(2) Then Console.WriteLine(dict(2)) End If
主な特徴:
配列のようにインデックスでDictionaryにアクセスできますか?
いいえ、Dictionaryは数値インデックスによるアクセスをサポートしておらず、キーによってのみアクセスが可能です。順序でキーを列挙するには、キーのコレクションを取得する必要があります:
For Each key In dict.Keys Console.WriteLine(dict(key)) Next
インデックス範囲外でListにアクセスするとどうなりますか?
ArgumentOutOfRangeExceptionの例外が発生します。常に、インデックスがCountより小さく、0以上であることを確認してください。
For Eachでコレクションがループ中に変更されると要素をスキップしますか?
はい、For Each内でコレクションを変更するとInvalidOperationExceptionが発生します。イテレーション中に要素を追加または削除することは避けてください:
' エラーの例 For Each x In list list.Remove(x) ' 例外を投げます Next
初心者がFor Eachループ内でListに要素を追加しており、その結果アプリケーションはInvalidOperationExceptionエラーでクラッシュしていました。
利点:
ループを開始する前に要素のリストを別の配列に保存し、コピーで作業するか、インデックスを持つForを使用します。鍵の存在を確認した後にのみDictionaryにアクセスします。
利点: