型情報はコンパイラにとって重要ですが、コードを読む人間にとってはそれほど重要でないことがあります。 それで型が明らかな場合は明示せず、コンパイラが型を「推論」するようにするのが、型推論です。
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で型推論が有効にするには、次の二つの方法があります。
“Infer” は “Inference” の略で、推論・推測という意味です。型推論は英語で“Type Inference”と言います。
まとめ
以上、VB.NETで、明らかな型名を省略する型推論を活用! でした。
型推論は、上手に活用するととても便利な言語機能です。