VB.NETで文字列の長さを数える方法!(Lengthプロパティ)

VB.NET

VB.NETで文字列の長さを取得することは、入力検証、データ処理、レポート作成など、様々なプログラミングタスクで非常に基本的な操作です。
この記事では文字列の長さを確認する方法について書いています。

Lengthプロパティの基本的な使い方

VB.NETで文字列の長さを数えるには、StringクラスのLengthプロパティを使用すると良いです。

構文

Dim stringVariable As String = "あなたの文字列"
Dim length As Integer = stringVariable.Length

文字列のstringVariable変数を作成しています。
次の処理でLengthプロパティにアクセスして、文字数を取得しています。

使用例

Module StringLengthExample
    Sub Main()
        Dim myString As String = "Hello VB.NET!"
        Dim stringLength As Integer = myString.Length

        Console.WriteLine($"文字列: ""{myString}""")
        Console.WriteLine($"長さ: {stringLength} 文字") ' 出力: 長さ: 13 文字

        Dim emptyString As String = ""
        Console.WriteLine($"空文字列の長さ: {emptyString.Length} 文字") ' 出力: 空文字列の長さ: 0 文字
    End Sub
End Module

myString変数に「Hello VB.NET!」という文字列を格納して出力しています。
結果は、空白も含めて「13」となります。

次の処理では、空白文字を格納したemptyString変数を用意しています。
空白文字列は長さが「0」になります。

Lengthプロパティは文字数を数える

Length プロパティは、文字列内の文字の数を数えます。

半角・全角文字

どちらも1文字としてカウントされます。

空白文字

半角スペース、全角スペース、タブ、改行コードなども1文字としてカウントされます。

ユニコード文字

絵文字などのマルチバイト文字も、通常は1文字(より厳密にはUTF-16のコード単位)としてカウントされます。
複雑なユニコード文字の表示上の文字数が必要な場合は、System.Globalization.StringInfoクラスを使用することがありますが、一般的な用途ではLengthで十分です。

様々な文字種を含む文字列

Module CharTypeLengthExample
    Sub Main()
        Dim s1 As String = "あいうえお" ' 全角文字
        Dim s2 As String = " Hello World " ' 半角スペースを含む
        Dim s3 As String = "123😂" ' 数字と絵文字

        Console.WriteLine($"文字列: ""{s1}"", 長さ: {s1.Length} 文字") ' 出力: 5 文字
        Console.WriteLine($"文字列: ""{s2}"", 長さ: {s2.Length} 文字") ' 出力: 13 文字 (前後のスペースも含む)
        Console.WriteLine($"文字列: ""{s3}"", 長さ: {s3.Length} 文字") ' 出力: 5 文字 (絵文字は2つのUTF-16コード単位で構成されるため、表示上の文字数と異なる場合がある)
    End Sub
End Module

絵文字(サロゲートペア)の扱いについて、Length はUTF-16のコード単位数を返すため、1つの絵文字が2文字とカウントされることがあります。
上記の例では絵文字が2文字にカウントされています。

厳密に「表示上の文字数」が必要な場合は、System.Globalization.StringInfo.GetTextElementEnumerator を使うことを検討してください。
しかし、ほとんどの検証作業ではLengthで問題ないかと思います。

Nothing(Null)文字列の扱い

文字列の変数がNothingの場合にLengthプロパティにアクセスしようとすると、NullReferenceException が発生します。
これを防ぐためには、事前にチェックを行う必要があります。

If文(IsNot)でチェックする

最も基本的な方法です。

Module NullStringLengthExample
    Sub Main()
        Dim nullString As String = Nothing
        Dim resultLength As Integer = 0

        If nullString IsNot Nothing Then
            resultLength = nullString.Length
            Console.WriteLine($"Nullではない文字列の長さ: {resultLength} 文字")
        Else
            Console.WriteLine("文字列はNothingです。") ' 出力: 文字列はNothingです。
        End If

        Dim nonNullString As String = "ABC"
        If nonNullString IsNot Nothing Then
            resultLength = nonNullString.Length
            Console.WriteLine($"Nullではない文字列の長さ: {resultLength} 文字") ' 出力: Nullではない文字列の長さ: 3 文字
        Else
            Console.WriteLine("文字列はNothingです。")
        End If
    End Sub
End Module

IsNot NothingNothingじゃない場合と、Nothingの場合で処理を分けています。
Nothingではない場合だけ、Lengthにアクセスすることでエラーが発生しません。

String.IsNullOrEmptyまたはString.IsNullOrWhiteSpaceを利用する

空文字列 ("") と Nothing の両方をまとめてチェックしたい場合に便利です。

  • String.IsNullOrEmpty(str): strNothing か空文字列 ("") の場合に True を返します。
  • String.IsNullOrWhiteSpace(str): strNothing か空文字列 ("")、または空白文字のみで構成されている場合に True を返します。
Module IsNullOrEmptyExample
    Sub Main()
        Dim s1 As String = Nothing
        Dim s2 As String = ""
        Dim s3 As String = "   " ' スペースのみ
        Dim s4 As String = "Test"

        If String.IsNullOrEmpty(s1) Then Console.WriteLine("s1 は Nothing または空です。") ' 出力: s1 は Nothing または空です。
        If String.IsNullOrEmpty(s2) Then Console.WriteLine("s2 は Nothing または空です。") ' 出力: s2 は Nothing または空です。
        If String.IsNullOrEmpty(s3) Then Console.WriteLine("s3 は Nothing または空です。(False)") ' 出力されない
        If String.IsNullOrEmpty(s4) Then Console.WriteLine("s4 は Nothing または空です。(False)") ' 出力されない

        Console.WriteLine("--- IsNullOrWhiteSpace ---")
        If String.IsNullOrWhiteSpace(s1) Then Console.WriteLine("s1 は Nothing または空白です。") ' 出力: s1 は Nothing または空白です。
        If String.IsNullOrWhiteSpace(s2) Then Console.WriteLine("s2 は Nothing または空白です。") ' 出力: s2 は Nothing または空白です。
        If String.IsNullOrWhiteSpace(s3) Then Console.WriteLine("s3 は Nothing または空白です。") ' 出力: s3 は Nothing または空白です。
        If String.IsNullOrWhiteSpace(s4) Then Console.WriteLine("s4 は Nothing または空白です。(False)") ' 出力されない
    End Sub
End Module

上記の例ではIsNullOrEmptyIsNullOrWhiteSpaceを使って、Nothingや空白文字を判定しています。
IsNullOrWhiteSpaceの場合はスペースのみが入っていた場合もTrueが返ってきています。

通常、ユーザー入力の検証などでは String.IsNullOrWhiteSpaceの方がより実用的です。

Null 条件演算子 (?.) を利用する

この方法では、文字列がNothingの場合にNothing(=Nullable(Of Integer))が返されます。
そのままConsole.WriteLineに渡すと、出力結果は空白(または “Null”)になります。

必ず「0」を返したい場合は、Null合体演算子(?? / If())などで補完してください。

Module NullConditionalExample
    Sub Main()
        Dim nullString As String = Nothing
        Dim nonNullString As String = "Hello"

        ' nullString?.Length は Nothing の場合、0 を返す (Integer のデフォルト値)
        Console.WriteLine($"Null文字列の長さ: {nullString?.Length} 文字") ' 出力: Null文字列の長さ:  文字

        Console.WriteLine($"非Null文字列の長さ: {nonNullString?.Length} 文字") ' 出力: 非Null文字列の長さ: 5 文字
    End Sub
End Module

この方法は非常に簡潔で便利ですが、VB.NETのバージョンに依存します。(VB.NET 14/.NET Framework 4.6 以降)

LengthプロパティとLen関数の違い

VB.NETには、Length プロパティの他に Len 関数(Microsoft.VisualBasic.Strings.Len)も存在します。
Len 関数は旧来のVisual Basic 6.0などとの互換性のために提供されていますが、.NET Frameworkでは**Length プロパティの使用が推奨されます**。

Lengthプロパティ

  • System.String クラスのメンバーであり、.NETの標準的な方法です。
  • 文字数を返します。
  • パフォーマンスが良いです。
  • 文字列が Nothing の場合にアクセスすると NullReferenceException を発生させます。

Len関数

  • Microsoft.VisualBasic 名前空間の関数です。
  • 文字列の場合は文字数を返しますが、バリアント型やオブジェクト型の場合は、その型に応じたバイト数や要素数を返すこともあります。
  • 文字列が Nothing の場合でも 0 を返します。(Length との違い
  • パフォーマンスは Length プロパティより劣る可能性があります。
Module LenVsLengthExample
    Sub Main()
        Dim s As String = "ABCDE"
        Dim nullS As String = Nothing

        Console.WriteLine($"Length プロパティ: {s.Length}")       ' 出力: 5
        Console.WriteLine($"Len 関数: {Len(s)}")                  ' 出力: 5

        ' Null の場合
        Console.WriteLine($"Length プロパティ (Null): {If(nullS Is Nothing, "Null", nullS.Length.ToString())}") ' 例外回避のためIfで出力
        Console.WriteLine($"Len 関数 (Null): {Len(nullS)}")      ' 出力: 0 (Len関数はNullでも0を返す)
    End Sub
End Module

新規開発では、統一性とパフォーマンスの観点からLengthプロパティを使うべきです。
Len関数は、古いコードの移行時などに利用されることがあります。

まとめ

VB.NETで文字列の長さを数える最も適切で効率的な方法は、String.Lengthプロパティを使用することです。
このプロパティは文字列に含まれる文字数を正確に返します。

ただし、文字列変数がNothingでないことを常に確認することが重要です。
If IsNot NothingString.IsNullOrEmpty / String.IsNullOrWhiteSpace、または Null 条件演算子 ?. を使用して確認する)

旧式のLen関数ではなく、.NETの標準であるLengthプロパティを積極的に活用し、堅牢なコードを記述しましょう。

コメント