たかが文字列連結で上司に指摘された話

会社の先輩にレビューで指摘を受けた話。

備忘録として残します。詳しい解説は他サイトに任せます。

VB.NETで文字列連結してみよう

余裕でしょ

業務で以下のようなコードを書いたところ、先輩から指摘を受けました。

Public Class Application
    Public Shared Sub Main()
        Dim person As String = "キャル"
        Dim word As String = "ヤバイわよ!"
        
        System.Console.Write(person + "「" + word + "」" + vbCrLf)    
    End Sub
End Class

vbCrLfは改行コードです。

実行結果

キャル「ヤバイわよ!」

何がヤバイのか

2つの点を指摘されました。

  • 文字列連結にはプラス(+)ではなくアンパサンド(&)を使うこと。
  • 連結が多くなる場合は、StringBuilderを用いること。

文字列連結は+を使うってペコリーヌも言ってたよ

私の尊敬する方の一人にペコリーヌさんという凄腕プログラマーがいます。

ペコリーヌさんは食わず嫌いなので、数多のプログラミング言語を触っています。

ペコリーヌさん曰く、

文字列連結は+を使う言語が多いですね!JavaPythonC++JavaScriptRuby、Go、Scala、F#、...

後半の方はよく知らない言語が多く、聞き流してしまいました。

とりあえず文字列連結はプラス(+)を使っておけばOKだと思っていました。

VB.NETプラス(+)とアンパサンド(&)どちらも文字列連結に使えるから、わざわざ慣れているプラスから変える必要は無いよね?

ヤバイ落とし穴があった

実際のプログラムを見てみましょう。

Public Class Application
    Public Shared Sub Main() 
        Dim a As Integer = 2
        Dim b As String = "4"
       
        System.Console.Write(a + b)
        System.Console.WriteLine("歳、学生です。")
    End Sub
End Class

何も考えず、数値型と文字列型を文字列連結したいことってありますよね?

データの型を意識するのが困難なケースもあると思うので、サクッと書ければ嬉しいものです。

このコードを実行してみると...

6歳、学生です。

...普通だな!

下手すると、この子は学生ではなく児童かもしれません。

なぜか期待した結果と違いますね。

よく見てみると、数値型と文字列型の足し算が行われているようです。

最初はただ文字列連結がしたいだけだったのに...(東京神話)

段々と脱線してきました。プラスからアンパサンドに変えてみましょう。

Public Class Application
    Public Shared Sub Main() 
        Dim a As Integer = 2
        Dim b As String = "4"
       
        System.Console.Write(a & b)
        System.Console.WriteLine("歳、学生です。")
    End Sub
End Class

実行結果

24歳、学生です。

やったぜ。

文字列連結はプラスでもアンパサンドでもどっちでもOKと言っておきながら、Microsoftアンパサンドを推奨しています。

+演算子を使用すると、加算または文字列の連結が行われるかどうかを判断できない場合があります。 &演算子を連結に使用して、あいまいさをなくし、自己記述型のコードを提供します。

+ 演算子 (Visual Basic) | Microsoft Docs

詳しくは上記のサイトでご確認ください。

そんなにヤバくは無い方

2つ目の指摘、StringBuilderは実行時間で優位になるものらしいです。

あとはプログラムの見やすさも向上しますね。

気になる方は、下記のサイトが分かりやすいので見てみてください。

文字列処理を高速に行う - .NET Tips (VB.NET,C#...)

まとめ

公式ドキュメントはちゃんと読もう。

たかが文字列連結。されど文字列連結。。。

あとGoogleで検索して一番上に出てくる、最終的にプログラミング教室に誘うサイトは過信してはいけない。