基本的な本能
エラー修正機能を使用してエラーがない状態を維持する
Dustin Campbell
この記事は、部分的に、Visual Studio のプレリリース版を基にしています。ここに記載されているすべての情報は、変更される場合があります。
目次
エラー修正の導入
キーボードを使用したエラー修正の適用
無効なコードの解決
正しい型変換の使用
スペル ミスの修正
名前空間のインポート
新しい型とメンバーの生成
まとめ
Microsoft Visual Studio での Microsoft Visual Basic コードの編集に最も役立つ機能の 1 つがバックグラウンド コンパイルです。この機能は Microsoft Word に組み込まれているスペル チェックや文章校正に似た性質があるため、既によくご存知だと思います。コードを入力すると、Visual Basic コンパイラがバックグラウンドで実行されます。間違ったコードを入力すると、エディターでエラーの下に波線が表示され、エラーが [エラー一覧] ウィンドウに追加されます。
Visual Studio 2005 より前のバージョンでは、エラーを解決するための唯一の手がかりは、主にエラー メッセージそのものでした。Visual Basic コンパイラは、可能な限り、エラーの内容だけでなく、解決方法も示すことを目的としたエラー メッセージを生成します。
では例を見てみましょう。以下のような Visual Basic コードがあるとします。
Module Module1
Sub Main()
Dim i As Integer = "1"c
End Sub
End Module
上記のコードでは、Char から Integer へのどのような変換を想定しているかがあいまいなため、コンパイラ エラーが生成されます。つまり、コンパイラは、ASCII 値の "1"c を生成する変換を挿入すべきなのか、数値の "1"c を生成する変換を挿入すべきなのかわかりません。コンパイラには、以下のエラー メッセージを生成することしかできません。
"'Char' 値を 'Integer' に変換することはできません。文字を Unicode 値として扱うには 'Microsoft.VisualBasic.AscW' を、数字として扱うには 'Microsoft.VisualBasic.Val' を使用してください。"
上記のエラー メッセージは問題の解決方法をできる限り細かく説明しようとしていますが、実際にエラーを解決するには開発者がもっと明確にコーディングする必要があります。
エラー修正の導入
エラーの解決を容易にするために、エラー修正 UI が導入されました。Visual Studio 2005 および 2008 では、エディターでの入力にエラーが発生すると、その位置にスマート タグが使用できることを示す短く赤い横棒と波線が追加されます (図 1 参照)。
図 1 スマート タグ インジケーター付きの、エラーを示す波線
スマート タグ インジケーターの上にマウス ポインターを移動すると、折りたたまれたスマート タグがツールヒントと共に表示されます。図 2 にこれを示します。
図 2 折りたたまれたスマート タグ
スマート タグをクリックすると、エラー修正 UI が展開され、この特定のコード エラーに利用できるオプションが表示されます (図 3 参照)。
図 3 使用可能なエラー修正を表示する、展開されたスマート タグ
エラー修正 UI によって、迅速かつ正確なエラーの解決が容易になります。コードに加えられる変更が、プレビュー ウィンドウに明確に示されます。この解決方法を適用するには、2 つのハイパーリンクのいずれかをクリックするだけです。
場合によっては、コンパイラがエラーを解決できることもありますが、すべてを解決できるわけではありません。このように不確かな場合、主にパフォーマンスを向上する目的で、Visual Basic IDE は、そのエラーのスマート タグ インジケーターをオプティミスティックに作成します。そのエラーに対して解決の可能性を示すスマート タグ インジケーターを作成する方が、各エラーをチェックして間違いなく解決できるかどうかを判断してからインジケーターを作成するよりもはるかに迅速です。エラー修正候補がないスマート タグ インジケーターにマウス ポインターを移動すると、"修正候補はありません" というメッセージが表示されます (図 4 参照)。
図 4 修正候補はありません
キーボードを使用したエラー修正の適用
エラー修正は、マウスだけでなく、キーボードを使用して適用することもできます。エディターのカーソルが、スマート タグ インジケーター付きのエラーを示す波線上にあれば、Shift キーを押しながら Alt キーと F10 キーを同時に押してスマート タグを展開し、エラー修正のオプションを表示できます。スマート タグが展開された状態で、上方向キーと下方向キーを押してオプション間を移動し、Enter キーを押してエラー修正を適用することができます。Shift キーを押しながら Alt キーと F10 キーを同時に押すというキーボード ショートカットが気に入らなければ、Ctrl キーを押しながら . キーを押してもスマート タグが表示されます (個人的には、Ctrl キーを押しながら . キーを押す方がはるかに覚えやすく、使いやすいと感じています)。
無効なコードの解決
コードの構造が無効なため、コードにエラーが含まれることはよくあります。よくある間違いは、対になっていないかっこを含むコードを記述することです。以下のコードに含まれるエラーがおわかりでしょうか。
Module Module1
Sub Main()
Dim quad = Function(a, b, c) _
Function(x) (a * x * x) + (b * x) + c
Dim f = quad(1.0, -79.0, 1601.0)
Console.Write(f(42.0)
End Sub
End Module
コードが無効なため (たとえば、上記のコードでは Console.Write への呼び出しでかっこが不足しているため) にコンパイルされないとき、Visual Basic IDE では、適用すればコードが有効になるエラー修正候補を表示します。図 5 は、不足しているかっこを挿入するエラー修正候補を示しています。
図 5 かっこを挿入するエラー修正
無効なコードのエラー修正は、メソッド本体内のコードに限定されません。たとえば、以下のような読み取り専用のプロパティがあり、そのプロパティを set アクセス操作子を含む完全なプロパティに変換するとします。
Class Person
Private _name As String
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
End Class
上記のコードに set アクセス操作子を追加するには、以下の操作を行います。
- End Get の後ろにエディターのカーソルを移動する
- Enter キーを押す
- 「Set」と入力する
- 再び Enter キーを押す
この操作では、以下のような無効コードが作成されます。
Class Person
Private _name As String
Public ReadOnly Property Name() As String
Get
Return _name
End Get
Set(ByVal value As String)
End Set
End Property
End Class
プロパティを有効にするには、ReadOnly キーワードを削除する必要があります。ここで、このキーワードを削除する作業は簡単ですが、以下のようにエラー修正を使用して行った方が容易かつ効率的です。
- 上方向キーを押して、エディターのカーソルをエラーを示す波線に移動する
- Ctrl キーを押しながら . キーを押して、エラー修正候補を表示する (図 6 参照)
- 下方向キーを押して、最初のエラー修正にフォーカスを移動する
- Enter キーを押して適用する
図 6 set アクセス操作子を含む読み取り専用プロパティのエラー修正
おわかりのように、エラー修正は正しいコードを記述するのに役立つだけでなく、作業時間を大幅に短縮できます。
正しい型変換の使用
既定では、Visual Basic は厳密な型指定は行いません。そのため、Visual Basic コンパイラがサポートする暗黙のデータ型変換と遅延バインディングを利用できます。
Module Module1
Sub Main()
Dim s As String = 42
End Sub
End Module
上記のコードの場合、コンパイラは Integer から String への型変換を正しく挿入します。
ただし、厳密な型指定を使用する場合は、Visual Basic のエラー修正を使用して、厳密な型指定が無効になっている場合にコンパイラが実行するのと同じ型変換を挿入できます。図 7 は、厳密な型指定が有効になっている場合の上記のコードのエラー修正を示しています。
図 7 Integer から String に変換するエラー修正
スペル ミスの修正
場合によっては、単なるスペル ミスによってコード エラーが生じることがあります。型名のスペルを間違えると、Visual Basic は、似た名前の既存の型をエラー修正候補として表示します。スペル ミスを含む以下のコードについて考えてみましょう。
Class Class1
End Class
Class Class2
End Class
Module Module1
Sub Main()
Dim c As New Clss
End Sub
End Module
上記のコードでは、誤って「Clss」という型のインスタンスを作成しようとしていますが、このような型は存在しません。この場合、2 つのエラー修正候補があります。つまり、Clss を Class1 に変更するエラー修正と、Clss を Class2 に変更するエラー修正です (図 8 参照)。
図 8 スペル ミスのエラー修正
現時点のスペル チェックはかなり単純で、型名にしか機能しません。ただし、この点について、Visual Basic チームは今後のリリースで強化することを検討しています。
名前空間のインポート
Visual Studio 2005 のリリース後、エラー修正の追加に関する要求が Visual Basic チームにいくつか寄せられました。これらの要求の中で主だったものは、Imports ステートメントを自動追加するエラー修正でした。型を使い始めるのはかなりもどかしく、名前空間のインポートを忘れることがあります。たとえば、System.IO.File クラスを使用してディスクからファイルを開いて読み取るとします。
Module Module1
Sub Main()
Dim fileName = Path.Combine("C:\Temp", "Sizes.txt")
Using f = File.OpenRead(fileName)
End Using
End Sub
End Module
System.IO 名前空間をインポートしていなければ、上記のコードはエラーになります。Visual Studio 2008 には、このエラーについて次の 2 つのエラー修正が用意されています。
- 名前空間をインポートする
- 参照を修飾する
これを図 9 に示します。最初のエラー修正候補を選択すると、System.IO 名前空間を容易にインポートできます。
図 9 Imports ステートメントを追加するエラー修正
ここで問題です。名前空間のインポートによって、コードの意味が変化するとしたらどうなるでしょう。上記のコードでさらに、Sizes.txt ファイルから読み取ったデータを使用し、Windows Presentation Framework (WPF) を使用して System.Windows.Shapes.Rectangle を作成するとします。この場合、WPF 参照を追加して、まず、以下のように新しい Rectangle のインスタンスを作成します。
Imports System.IO
Module Module1
Sub Main()
Dim fileName = Path.Combine("C:\Temp", "Sizes.txt")
Using f = File.OpenRead(fileName)
Dim r As New Rectangle
End Using
End Sub
End Module
前と同じように、名前空間をインポートしていないため、図 10 に示すエラー修正 UI を使用して名前空間をインポートします。ところが、ここで問題が発生します。System.Windows.Shapes 名前空間にも Path という型が含まれるため、名前空間をインポートすると、コードの意味が変化します。
図 10 System.Windows.Shapes 名前空間をインポートするエラー修正
さいわい、Imports ステートメントを追加するエラー修正には、このような状況を回避するロジックが組み込まれています。エラー修正によって問題が認識され、[インポート検証の追加エラー] ダイアログ ボックスが表示されます (図 11 参照)。
図 11 [インポート検証の追加エラー] ダイアログ ボックス
このダイアログ ボックスには、以下のようにエラー修正を微調整する 2 つのオプションが表示されるため、コードの意味は変化しません。
- 'System.Windows.Shapes' をインポートし、影響を受けた識別子を有効にする。
- 'System.Windows.Shapes' をインポートせずに、'Rectangle' を 'Windows.Shapes.Rectangle' に変更する
最初のオプションを選択すると、以下のように、System.Windows.Shapes 名前空間の Imports ステートメントが追加され、Path への参照が完全修飾されます。
Imports System.IO
Imports System.Windows.Shapes
Module Module1
Sub Main()
Dim fileName = System.IO.Path.Combine("C:\Temp", "Sizes.txt")
Using f = File.OpenRead(fileName)
Dim r As New Rectangle
End Using
End Sub
End Module
繰り返しますが、このエラー修正は Visual Studio 2008 のみで使用できます。Visual Studio 2005 を使用する場合、Imports ステートメントの追加に関する候補は表示されません。
新しい型とメンバーの生成
Visual Basic のエラー修正はまだ終わりではありません。Visual Studio 2010 では、"使用法から生成" という新機能が導入される予定です。この機能を使用すると、新しい型とメンバーを容易に生成できます。Visual Basic では、この機能は一連のエラー修正として実装されるため、既存のエラー修正を使用してこの機能を利用できます。多くの場合、"使用法から生成" のエラー修正機能では、以前はなかったコンパイラ エラーの修正候補が表示されます。たとえば、図 4 をもう一度見てください。Visual Studio 2008 では、このコードに対応できるエラー修正はありません。しかし、Visual Studio 2010 では、"使用法から生成" 機能によって新しいエラー修正候補が表示されます。図 12 は、同じコードに対する Visual Studio 2008 と Visual Studio 2010 のエラー修正の違いを示しています。
図 12 クラスの生成
最初の修正候補を選択すると、新しいファイルに Customer という新しいクラスが生成されます。これで、Customer クラスのメンバーを使用するコードを記述し、エラー修正を使用してメンバーのスタブを生成できるようになります。たとえば、図 13 は、まだ宣言していないクラスのメンバーに値を代入した後のエラー修正を示しています。
図 13 プロパティまたはフィールドの生成
最初の修正候補を選択した後、生成される Customer クラスは以下のようになります。
Class Customer
Property Name As String
End Class
Visual Studio 2010 では、"使用法から生成" のエラー修正を活用して効率を最大限に高めることができます。
まとめ
エラー修正は、Visual Basic のコーディング作業に欠かせない要素です。エラー修正を使用すると、エラーをすぐに見つけて修正できるだけでなく、より効率的にコードを記述できます。このコラムで紹介したのは、Visual Basic によって表示される何百もの修正候補のほんの一部にすぎません。Visual Studio 2010 には、ほとんどのコーディング エラーのエラー修正が用意されています。
Ctrl キーを押しながら . キーを押すのをお忘れなく。
ご意見やご質問は instinct@microsoft.com まで英語でお送りください。
Dustin Campbell は、Microsoft Visual Studio Languages チームの Microsoft Visual Basic IDE プログラム マネージャーで、主にエディターおよびデバッガー製品の機能に従事しています。彼はプログラミング言語マニアとして、C# や F# といった Visual Studio の他の言語にも携わっています。マイクロソフトに入社する前は、Developer Express Inc で受賞歴のある CodeRush および Refactor! ツールの開発をサポートしました。彼の好きな色は青です。