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 NothingでNothingじゃない場合と、Nothingの場合で処理を分けています。
Nothingではない場合だけ、Lengthにアクセスすることでエラーが発生しません。
String.IsNullOrEmptyまたはString.IsNullOrWhiteSpaceを利用する
空文字列 ("") と Nothing の両方をまとめてチェックしたい場合に便利です。
String.IsNullOrEmpty(str):strがNothingか空文字列 ("") の場合にTrueを返します。String.IsNullOrWhiteSpace(str):strがNothingか空文字列 ("")、または空白文字のみで構成されている場合に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
上記の例ではIsNullOrEmptyとIsNullOrWhiteSpaceを使って、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 Nothing や String.IsNullOrEmpty / String.IsNullOrWhiteSpace、または Null 条件演算子 ?. を使用して確認する)
旧式のLen関数ではなく、.NETの標準であるLengthプロパティを積極的に活用し、堅牢なコードを記述しましょう。

コメント