みなさんこんにちは!
ひろぽんです!
そういえばVB.NETで右から何文字って感じで文字を取得するのってどうするんだっけ??って思っていろいろ調べたので記事にしようと思います!
VB.netで右からの文字列を取得するには、Strings.Rightを使う
💡 VB.net の文字列関数を C# に書き直したい場合は VB.net で Right / Mid / Left を C# に翻訳する完全早見表 でまとめてます。VB6 移行案件で必須の対応表です。
これ。私いろいろ勘違いしていました。
下記のようなコード(変数に値を入れてるだけ)があった場合、name.Rightで右からの文字を取得できると思ったんです。
Sub Main()
Dim name = "東京太郎"
End Sub
でもname.Rightというのはありません。
よくよく調べてみるとVB.netの場合、Stringsというモジュールが用意されており、これを使うことで、右から何文字って感じで文字を取得することができるみたいですね!
Sub Main()
Dim name = "東京太郎"
Dim getName = Strings.Right(name, 2)
Console.WriteLine(getName)
Console.ReadLine()
End Sub
Stringsモジュールには何がある?
ではVB.netにだけ用意されているStringsモジュールですが、他にどんな便利なメソッドがあるのか調べてみました!
独断と偏見で便利だなーと思ったメソッドを羅列していきます!
String.splitで文字を分ける
Sub Main()
Dim place = "東京,大阪,名古屋"
Dim places = Strings.Split(place, ",")
Console.WriteLine(places(0) & places(1) & places(2))
Console.Read()
End Sub
第1引数に分けたい文字列、第2引数に分ける文字を。これで戻り値がstringsの配列で分けて戻ってきます。

Strings.Joinで文字配列を1つの文字列にする
Sub Main()
Dim places As String() = {"東京", "大阪", "名古屋"}
Dim combineStr = Strings.Join(places)
Console.WriteLine(combineStr)
Console.Read()
End Sub
これを実行すると

Strings.InStrで文字列のどの部分に含まれているかを返す
Sub Main()
Dim name = "東京太郎"
Dim resultNum = Strings.InStr(name, "東京")
Console.WriteLine(resultNum)
Console.Read()
End Sub
これを実行すると

もし指定した文字列が存在しなかった場合、下記のようになります。
Sub Main()
Dim name = "東京太郎"
Dim resultNum = Strings.InStr(name, "大阪")
Console.WriteLine(resultNum)
Console.Read()
End Sub

なのでこれを応用すると下記のようなことができますね!
Sub Main()
Dim weather = "東京は今日はいい天気です"
Dim notContain = 0
If Strings.InStr(weather, "大阪").Equals(notContain) Then
Console.WriteLine("文字列に大阪は含まれていません")
Else
Console.WriteLine("文字列に大阪は含まれています。")
End If
Console.Read()
End Sub

文字列の存在チェックですが、書いていて思った。
これcontainsで出来ますね。
下記で代用できますね。
Sub Main()
Dim weather = "東京は今日はいい天気です"
If weather.Contains("大阪") Then
Console.WriteLine("文字列に大阪は含まれています。")
Else
Console.WriteLine("文字列に大阪は含まれていません")
End If
Console.Read()
End Sub

以上!
Vb.netだけに存在するStringsモジュールの話でした!
C#の場合同じ.netでもモジュールって考え方が無いので、別の方法で取得しなければいけません!
💡 補足: 業務系の現場でよくハマるパターン
VB.net の文字列処理、特に C# に移植するときの罠が3つほど。VB6 から VB.net、そして C# へ移行する案件で何度も踏みました。
① C# の Substring と引数順序が逆で混乱する
VB.net の Strings.Right(text, 3) は「右から3文字」ですが、C# に直訳しようとして text.Substring(3) と書くと「先頭3文字を捨てる」になり、結果が逆になります。C# 相当は text.Substring(text.Length - 3)。地味だけど移植時の頻出バグです。 VB.net Right/Mid/Left を C# に翻訳する完全早見表 に対応表を出してます。
② Null 文字列で NullReferenceException
VB.net の Strings.Right(Nothing, 3) は空文字を返してくれますが、C# の str.Substring(str.Length - 3) は str が null だと NullReferenceException で落ちます。VB6 → C# 移植時は null チェックを必ず噛ませるか、 str?.Substring(...) ?? "" の書き方にしておく。
③ 全角文字での「3文字」が想定と違う
VB.net の Strings.Right("あいうえお", 3) は「うえお」が返りますが、絵文字やサロゲートペアが入ると別の挙動になることがあります。.NET の文字列は基本 UTF-16 ですが、 StringInfo でグラフィム単位に分解しないと「絵文字を半分にぶった切る」事故が起きます。業務系では絵文字はまず無いですが、社員名にユニコード結合文字が入っていた事案は実際あります。
❓ よくある質問
Q1. VB.net の Mid 関数の C# 相当は?
A. Strings.Mid(text, 開始位置, 文字数) は C# の text.Substring(開始位置 - 1, 文字数) です。VB は 1 始まりなので -1 が必要。詳細は VB.net Right/Mid/Left を C# に翻訳する完全早見表 で対応表にしてます。
Q2. VB.net の Len 関数と String.Length の違いは?
A. ほぼ同じですが、 Len(Nothing) は 0 を返すのに対し、 (null as string).Length は NullReferenceException で落ちます。VB6 移行時に Len → Length に機械置換すると null 渡しで爆発します。
Q3. VB.net の InStr と C# の IndexOf の違いは?
A. Strings.InStr は 1 始まり・見つからないと 0 を返します。C# の IndexOf は 0 始まり・見つからないと -1 を返します。判定値が違うので変換時に if 文の条件を見直す必要あり。
Q4. VB.net の文字列結合パフォーマンス、C# でも同じ?
A. VB.net も C# も内部は同じ .NET ランタイムなので、大量結合では StringBuilder が定石。 C# 文字列結合のパフォーマンス完全比較 でベンチマーク付きで書いてます。
Q5. VB.net から C# に移植するときの定番のハマりポイントは?
A. 大きく3つ。(1)配列のインデックス基底(VB は 0/1 選択可、C# は 0 固定)、(2)文字列関数の引数順序(Right/Left/Mid)、(3)null vs Nothing の挙動差。これらは Form 間の値受け渡しで FormとFormの間で値の共有・受け渡し 系の設計時にもよく出てきます。
📚 関連記事
- VB.net で Right / Mid / Left を C# に翻訳する完全早見表 — VB → C# 移行のときの必携対応表
- C# 文字列結合のパフォーマンス完全比較 — VB.net の文字列処理を C# で再現するときに知っとくと得
- 【C#】FormとFormの間で値の共有・受け渡しをする! — VB.net 案件を C# にリプレースする時のForm間設計
- 【C#】DataGridViewにDataTable反映したり変換して取得したりする — VB.net の DataGrid から C# の DataGridView へ
- 【C#】Formの中にFormを表示して良い感じに切り替える — VB.net MDI から C# 切り替えへ

コメント