TotalTech

フリーランスのプログラマーが、技術情報・ガジェット・仕事術について書いてゆきます。資料価値の高い記事を目指しています。コーヒー好きです。

TotalTech

VB.NETで、明らかな型名を省略する型推論を活用!

VB.NETで型推論

型情報はコンパイラにとって重要ですが、コードを読む人間にとってはそれほど重要でないことがあります。 それで型が明らかな場合は明示せず、コンパイラが型を「推論」するようにするのが、型推論です。

VB.NET型推論は、実行時ではなくコンパイル時に型が解決されるので、実行速度に影響はありません

型推論は、開発者にとってとても便利な機能です。

型推論の方法

変数宣言の際に、代入で初期化する場合は、型推論が活用できます。


' 型推論なし
Dim n As Integer = 0

' 型推論あり
Dim n = 0

For文、For Each文でも、型推論できます。


' 型推論なし
For i As Integer = 1 To 10
  ' 処理
Next

' 型推論あり
For i = 1 To 10
  ' 処理
Next

' 型推論なし
For Each filepath As String In IO.Directory.GetFiles("C:\")
  ' 処理
Next

' 型推論あり
For Each filepath In IO.Directory.GetFiles("C:\")
  ' 処理
Next

型推論のメリット

型推論には、様々なメリットがあります。

メリット1: タイプ量が減る

例えば、オブジェクトをインスタンス化する時に、同じ型名を二度書かなくて良くなります


' 型推論なし
Dim key_value As Generic.List(Of Generic.KeyValuePair(Of String, Integer)) = New Generic.List(Of Generic.KeyValuePair(Of String, Integer))

' 型推論あり
Dim key_value = New Generic.List(Of Generic.KeyValuePair(Of String, Integer))

タイプ量が減ると、開発速度が向上し、間違いも少なくなります。

メリット2: コードの可読性が増す

冗長な記述が減るため、コードの可読性が増します。


' 型推論なし
Dim name_list As Generic.List(of String) = name_array.ToList()

' 型推論あり
Dim name_list = name_array.ToList()

メリット3: 型が変わった時に、修正部分が少なくなる

同じ型を何度も書かずに済むため、型が変わった時に、修正部分が少なくてすみます。

次の例でを考えてみましょう。


Private Function GetValues() As Integer()
  ' Integer配列を返す関数
End Function

' 型推論なし
Dim values As Integer() = GetValues()

' 型推論あり
Dim values = GetValues()

もしGetValues()の返り値の型がDouble()に変わったら、どうなるでしょうか。

型推論なし」のvaluesの型もDouble()に変更しないといけません。

一方、「型推論あり」のvaluesの型は記述されていないので、コードに変更はありません。

メリット4: 型を意識しなくてすむ

型を特に意識しないでコードを書くことは結構あります。

例えばLINQのクエリなどは、いちいち型を考えずに使うことが多いです。


Dim numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

' 型推論なし
Dim q As Generic.IEnumerable(Of Integer) =
  From n In numbers
  Where n <= 5
  Select n * n

For Each n As Integer In q1
  ' 処理
Next

' 型推論あり
Dim q =
  From n In numbers
  Where n <= 5
  Select n * n

For Each n In q2
  ' 処理
Next

このLINQクエリの型がGeneric.IEnumerable(Of Integer)だと、普通は考えないでしょう。

ラムダ式を使う際も、普通は型を意識しませんね。


Dim numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

' 型推論なし
Dim f As Func(Of Integer, Integer, Integer) = Function(x As Integer, y As Integer) x * y

' 型推論あり
Dim f = Function(x As Integer, y As Integer) x * y

型推論を使えば、型を意識せずにコードを書くことができます。

DRY原則 (Don’t Repeat Yourself)

プログラミングには、DRY原則という考え方があります。

DRY原則: 情報の重複は変更の困難さを増大し透明性を減少させ、不一致を生じる可能性につながるため、避けるべきである

型推論は有効に用いると、DRY原則に則って変更に強いコードを書くのに役立ちます。

DRY原則について、詳しくはこちらをご覧ください。

https://ja.wikipedia.org/wiki/Don’t_repeat_yourself

型推論を活用する時

型推論はとても便利ですが、乱用すると、コードの可読性が落ちる要因になり、危険です。

以下の時に限って型推論を用いるのが良いでしょう。

誰の目にも型が明白な時

コードを書く自分だけでなく、コードを見るチームメンバーの目にも型が明白な時は、型推論を用いて問題ないでしょう。

一方、ぱっと見で型が明らかでない場合は、型を明示したほうが無難です。

型を意識しない時

前述のLINQクエリのように、型を意識せずに用いて問題のない時は、型推論を用いるとコードの可読性が向上します。

VB.NET型推論を有効にするには

VB.NET型推論が有効にするには、次の二つの方法があります。

  • (ファイルごと) ソースコードの先頭にOption Infer Onと記述
  • (プロジェクトごと) プロジェクトの設定 → タブ「コンパイル」→ Option Infer を On にする

“Infer” は “Inference” の略で、推論・推測という意味です。型推論は英語で“Type Inference”と言います。

まとめ

以上、VB.NETで、明らかな型名を省略する型推論を活用! でした。

型推論は、上手に活用するととても便利な言語機能です。

VB.NETの正式名称については

Ookii.Dialogsで「フォルダーの選択」ダイアログを便利にするには