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
プロパティを積極的に活用し、堅牢なコードを記述しましょう。
コメント