November 2017
Volume 33 Number 11
Visual Studio - Visual Studio for Mac でのコードの編集とデバッグ
Alessandro Del Del | November 2017
Visual Studio for Mac は、Microsoft のモバイルファースト、クラウドファーストのビジョンを見事に体現した、Microsoft の強力で新しいネイティブ開発環境です。Xamarin と .NET Core によるクロスプラットフォーム アプリの作成や、Unity によるゲーム開発を支援する環境で、既存の .NET スキルと、C# や F# など、お気に入りのプログラミング言語を使用できます。Visual Studio for Mac の概要については、msdn.com/magazine/mt790182 を参照してください。今回は、コード エディターとデバッグ ツールの機能のうち、生産性向上に役立つ強力な一部の機能について説明します。
Roslyn ベースのコード エディター
Visual Studio for Mac では、macOS で C# と F# を使用してコードを記述できます。これは、プロジェクト「Roslyn」 (github.com/dotnet/roslyn、英語) とも呼ばれる .NET コンパイラ プラットフォームを利用することで実現されています。Roslyn は、豊富なコード分析 API を公開する、オープン ソースのクロスプラットフォーム .NET コンパイラを提供します。Windows 版の Visual Studio 2015 および 2017 と同様に、Visual Studio for Mac のコード エディターも Roslyn が基盤となり、構文の色分け、IntelliSense、コードの問題の即時検出、修正、リファクタリングによる高度なコード エクスペリエンスを提供します。コード修正とリファクタリングの基本的な使い方は、公式ドキュメントで説明されているため (bit.ly/2jKt69D)、ここでは、型の生成、冗長コードの削除、コード内の移動、カスタム言語とコード スニペットのサポートの追加など、より具体的な機能を取り上げます。これらの機能はすべて、Xamarin プロジェクトでも .NET Core プロジェクトでも利用できます。
コード作成中に型を生成する
コード エディターで特に便利な生産性向上機能の 1 つは、コーディング中に、アクティブなエディターにフォーカスしたまま、新しい型を生成できる機能です。たとえば、まだ存在しない型の名前を書くと、コード エディターでこの型名がコードの問題として強調表示されるので、型名を右クリックし (または、Alt キーを押しながら Enter キーを押して)、[クイック修正]、[型の生成] の順に選択します。図 1 の例は、Person という名前の型を生成しています。
図 1 アクティブな エディター内で新しい型を生成
1 つ目のオプション [Generate class ‘Person’ in new file] (’Person’ クラスを新しいファイルに生成) を選ぶと、Person という新しいクラスが internal 修飾子付きで Person.cs という新しいファイル内に生成されます。2 つ目のオプション [Generate class ‘Person’] (’Person’ クラスを生成) を選ぶと、Person という新しいクラスが現在のファイル内に生成されます。3 つ目のオプション [Generate nested class ‘Person’] (入れ子のクラス ‘Person’ を生成) を選ぶと、コード エディターで現在アクティブな型内に入れ子になって、Person という新しいプライベート クラスが生成されます (この例では、Program クラス内に新しいクラスが生成されます)。生成後に修飾子の internal または private は、手作業で変更することも、修飾子を右クリックしてやはり [クイック修正] を選択して変更することもできます。どのケースでも、生成された新しいクラスには空のコンストラクターがあります。4 つ目のオプション [新しい型の生成] を選ぶと、作成する型 (クラス、インターフェイス、または列挙型)、アクセス修飾子、および生成先を指定できるダイアログが表示されます。それだけではなく、同じ手法を使って、新しく生成した型にメンバーを追加することもきます。存在していないプロパティ、フィールド、またはメソッドを割り当てるか呼び出して、クイック修正を利用するだけで、簡単にメンバーを追加できます。その例として、図 2 では LastName という新しいプロパティを Person クラスに追加しています。[変数 'LastName' を生成する] オプションを選ぶと、現在のコンテキストに応じた選択肢が表示されます。
図 2 新しいメンバーの生成
この例では、コードの割り当てを行っているため、新しいプロパティまたはフィールドを生成する選択肢が表示されています。コードを基に、コード エディターは新しく生成するメンバーに適した型の割り当ても行うため、String 型のプロパティ (またはフィールド) も生成します。コード エディターは、メソッド呼び出しを分析して、対応するメソッド シグネチャを生成できます。この機能はコード リファクタリング ツールに含まれ、コード作成中にコードに専念できるようにします。
冗長コードを削除する
Visual Studio for Mac のコード エディターでは、冗長コードも強調表示されます。冗長コードとは、不要で使用されていないコードです。冗長コードは、グレーで表示されるので、簡単に認識できます。しくみとしては、冗長コードを問題とみなすソース分析ルールがあり、冗長コードをはそれらのルールを基に強調表示されます (これらのルールは制御できますが、ここでは説明しません)。 通常、冗長コードとして検出されるのは、不要なディレクティブの使用が大半ですが、それ以外のものも冗長コードとして認識されます。たとえば、空のコンストラクターや内部修飾子も冗長コードとして強調表示されます (図 3 参照)。
図 3 冗長コードの削除
冗長コード (明る目の色で区別されます) を右クリックし、[クイック修正] を選択すると、不要なコードを削除するコード修正のコマンドが表示されます。また、次の処理を実行できる "オプション" サブメニューも表示されます。
- 現在の問題検出を抑制する。
- Visual Studio の基本設定でさらに細かく分析ルールを構成する。
- ドキュメント、プロジェクト、またはソリューション レベルで、同じ種類の複数の問題に対してコード修正を適用する。
同様に、前出の例では、型を定義する冗長な内部修飾子も簡単に修正できます (実際、internal は C# の既定の修飾子です)。この手法は、エディター内で冗長コードを強調表示するすべての分析ルールで有効です。
コード内を移動する
コード ファイル間や 1 つのコード ファイル内のメンバー間の移動は、極めて頻繁に発生します。そのため、組み込みの強力なナビゲーション ツールがあると、生産性は大幅に向上します。Visual Studio for Mac には、ファイル、型、メンバー間の移動を簡単にする堅牢なツールがいくつか用意されています。1 つ目は、Ctrl キーを押しながら Tab キーを押すと、コード ファイル間をすばやく移動できる機能です。このキー操作により、ソリューションに含まれるファイルの一覧を参照できるポップアップが表示されます。もう一度 Ctrl キーを押しながら Tab キーを押すと、一覧内の項目が順番に選択され、キーを離すと、選択されていたファイルがエディターで開きます。ソース コード内の移動については、比較的知られていませんが、驚くほど便利な生産性向上機能を次のサブセクションで紹介します。
すべての参照の検索ツールと移動ツール
すべての参照の検索ツールを使用すると、ソリューション内の型やメンバーへのすべての参照を取得できます。このツールの実際の動作を確認するには、コード エディター内で型またはメンバー名を右クリックして、[すべての参照の検索] を選択します。[検索結果] パッドに参照が表示されます (図 4 参照)。
図 4 型またはメンバーの参照の検索
[検索結果] パッドには、(左から右に) 参照が含まれているプロジェクト、コード ファイルと参照の位置、参照されているオブジェクトを含むソース テキスト、ソース ファイルのフルパス名が表示されます。参照をダブルクリックすると、該当するコード ファイルがコード エディターで開かれて、選択された出現箇所にカーソルが置かれます。[テキスト] 列のソース コードで、基本の構文の色分けがどのようになっているかを確認してください。[すべての参照を検索] は非常に強力ですが、特定の型やメンバーの特性を基に検索をフィルター処理したい場合があります。それには、移動ツールを使用します。移動ツールを起動するには、型またはメンバーを右クリックして、[移動] を選択します。サブメニューとして、次の検索オプションが表示されます。
すべてのオーバーロードの参照を検索する: メソッドとそのオーバーロードのすべての参照を検索します。
基本シンボル: [移動] の実行対象の型が継承または実装している基本型と基本インターフェイスの一覧を検索できます。メソッドの場合は、現在のメソッドがオーバーライドしているメソッドの一覧が [移動] によって検索されます。
派生シンボル: [移動] の実行対象の型から継承されている型の一覧を検索できます。メソッドの場合は、[移動] の実行対象の型をオーバーライドしているメソッドの一覧が検索されます。
拡張メソッド: [移動] の実行対象の型の拡張メソッドで、現在のソリューションで定義されているものをすべて検索します。
メンバーのオーバーロード: [拡張メソッド] に似ていますが、現在のソリューションで定義されているメソッド オーバーロードの一覧を検索します。
メンバーの実装: 実行対象が抽象クラスまたはインターフェイスである場合、その型またはインターフェイスを実装する型とメンバー一覧が表示されます。
移動ツールは、すべての参照の検索とまったく同じ形式で [検索結果] パッドに検索結果を表示します。
スクロール バーとミニマップ モード
コード エディターのスクロール バーには、警告やエラーなどのコードの問題、ブレークポイント、ToDo 項目を表す色付きのマーカーが表示されます。上部には色付きのドットも表示され、このドットはアクティブなファイルにエラーがある場合は赤、警告がある場合は黄、問題が検出されない場合は緑になります。また、スクロール バーには、いわゆるミニマップ モードも用意されています。このモードを有効にすると、スクロール バーには移動を楽にするソース コードのプレビューが表示されます (図 5 参照)。
図 5 スクロール バーのミニマップ モード
ミニマップ モードを有効にするには、スクロール バーを右クリックし、[Show Minimap] (ミニマップの表示) を選択します。マップの特定の領域をクリックすると、コード エディターは該当するポイントにカーソルを移動します。ミニマップ モードを無効にするには、スクロール バーを再び右クリックし、[Show Tasks] (タスクの表示) を選択します。ミニマップ モードは、長いファイルで特に便利で、ファイル全体を俯瞰できます。
コード ファイル内のオブジェクトを閲覧する
Visual Studio for Mac には、コード ファイル内の型とメンバーを簡単に閲覧できるビジュアルな手段が用意されています。各コード エディターのウィンドウには階層リンクがあり、クリックするとアクティブなエディター内で定義されている型の一覧が表示されます。任意の型を選択すると、追加のタブが開き、その型のメンバーの一覧が表示されます。また、[ドキュメント アウトライン] パッドを使用して、アクティブなファイル内の型構造をビジュアルに表現することもできます (図 6 参照)。
図 6 コード ファイル内のオブジェクトの閲覧
さまざまなアイコンによって、各種メンバーが表現されます。[ドキュメント アウトライン] パッドに関しては、UI の階層をビジュアルに表示する機能を既にご存じかもしれませんが、型の構造のビューを表示する目的でも使用できます。これは非常に便利です。[ドキュメント アウトライン] 内でオブジェクトをダブルクリックするだけで、オブジェクトの定義にカーソルが移動します。
コード スニペットを記述する
Visual Studio for Mac は IntelliSense コード スニペットをサポートします。これは、作成済みのコード ブロック テンプレートで、ニーズに合わせてカスタマイズできます。Windows 版の Visual Studio の経験があれば、コード スニペットがどのようなものかは既にご存知だと思います。Visual Studio for Mac には、コード スニペットを挿入する方法が 2 種類あります。1 つ目は、コード エディターを右クリックし、[テンプレートの挿入] を選択する方法です。利用可能なコード スニペットの一覧が表示されるので、必要なスニペットを選びます。2 つ目は、入力中に IntelliSense 入力候補一覧からコード スニペットを選択する方法です。図 7 の例では、コード スニペットが強調表示されています (Tab キーを 2 回押すとスニペットが挿入されます)。
図 7 コード スニペットの追加
コード スニペットはアイコン (…) で表されているので、すぐにわかります。どちらの方法でも、コード スニペットの名前の上にマウス カーソルを置くと、コード スニペットの目的を説明するヒントが表示されます。Visual Studio for Mac では、外部ツールなしで、新しいカスタム コード スニペットの作成や、IDE 内の既存のスニペットの編集もできます。それには、[Visual Studio] メニューの [ユーザー設定] を選択します。[ユーザー設定] ダイアログで、[テキスト エディター] 配下の項目から [コード スニペット] を探して選択します。言語ごとにグループ化されたコード スニペットの一覧が表示されます。既存のスニペットを選ぶ場合は、[編集] ボタンをクリックして、コードを編集します。[追加] をクリックした場合は、新しいコード スニペットを作成できます。スニペットの作成は [新しいテンプレート] ダイアログで行います。このダイアログで、キーボード ショートカット、説明、MIME の種類、言語グループ、そしてもちろんソース コードを指定します。図 8 に例を示します。
図 8 カスタム コード スニペットの作成
$ 記号が置換用の識別子のマーキングに使用され、$selected$$end$ 式が現在のスニペットの区切りになっています。置換用の識別子をマーキングすると、ダイアログの右側のボックスで、既定値や識別子の意味を説明するヒントなど、識別子自体の追加情報を指定することもできます。完了したら、[OK] をクリックして [ユーザー設定] ダイアログを閉じます。この時点で、新しいコード スニペットがスニペット ライブラリに配置され、IntelliSense を利用してコード エディターから使用できるようになります。なお、キーボード ショートカットが存在していない場合、既存のスニペットを編集してキーボード ショートカットを割り当てることができます。それにより、コード エディター内でキーボード ショートカットを入力して、スニペットをさらにすばやく挿入できます。コード スニペットを多用する場合は、IDE 内でコード スニペットを作成できると、時間を大幅に節約できます。
カスタム言語を追加する
Visual Studio for Mac で特に便利な機能の 1 つは、デファクト スタンダードの TextMate と Sublime Text を文法のベースとする言語であれば、Visual Studio for Mac に標準で付属していない新しい言語を追加できることです。実際、Visual Studio for Mac は TextMate と Sublime Text の両方をサポートし、構文の色分け、コード スニペット、単語補完などの編集機能を提供する言語バンドルを追加できます。たとえば、Mac で特に有用性が高いと思われる Swift ファイルの編集をサポートする構文を追加する必要があるとします。TextMate または Sublime Text のどちらかで Swift 言語バンドルをインストールし、言語バンドルのパッケージをディスクにエクスポートします。その後、言語バンドルを Visual Studio for Mac にインポートします。それには、[ユーザー設定] ダイアログの [言語バンドル] ノードを使用します。そのノードで、[追加] をクリックし、以前エクスポートした言語パッケージを選択します。この時点で、.swift ファイル (またはインポートしたバンドルに応じたその他の種類のファイル) を開き、構文の色分けやコード ブロックの折りたたみなどの機能を利用できるようになります。
選択した言語バンドルにコード スニペットが含まれている場合は、コード エディターでコード スニペットを挿入することもできます。言うまでもなく、Visual Studio for Mac は、外部の言語バンドルを基にしたソース ファイルのコンパイルやアプリケーションのビルドと公開はサポートしません。代わりに、[オプション] メニューの [カスタム ツールの編集] を使用して、コンパイラなど、外部ツールの実行を自動化できます。
パッドおよび Debug クラスによるデバッグの生産性向上
デバッグは非常に重要で、Visual Studio for Mac には、高品質のアプリケーションを生産的な方法でビルドするために、あらゆる開発者が必要とする、トップクラスのデバッグ ツールが付属しています。公式ドキュメント (bit.ly/2xgJkx0) では、ブレークポイント、データ ビジュアライザー、条件付きフロー制御など、よく使用されるツールについて説明しています。ここでは、特に Windows 版の Visual Studio でのデバッグを熟知していて、Mac でも同じツールが提供されていることを期待している場合に、読者が関心を持ちそうな他の便利な機能について説明します。最初に、System.Diagnostics.Debug クラスについて説明します。このクラスを使用すると、アプリケーションの実行を中断せずに、C# の式の評価を [アプリケーション出力] パッドに出力できます。次のコードにより、ユーザー入力を待機する .NET Core コンソール アプリケーションがあるとします。
string inputString = Console.ReadLine();
Debug.WriteLine($"The entered string is {inputString.Length} characters long");
Debug.WriteLine メソッドは、アプリケーションの実行を停止することなく、[アプリケーション出力] パッドに式を出力します (図 9 参照)。この場合、式は、ユーザーが入力した長さの文字列を含む挿入文字列になります。
図 9 [アプリケーション出力] パッドに出力された評価の結果
WriteLine メソッドだけではなく、Assert、Equals、Fail、Write、WriteIf、WriteLineIf など、その他のサポートされるメソッドもすべて使用できます (詳細は bit.ly/2ydS8jO を参照)。
Visual Studio for Mac には、その他にも、デバッグ中に式を評価し、オブジェクトの値を調べる方法があります。ブレークポイントとデータ ビジュアライザーを使用できますが、変数、メソッド、式をビジュアルに監視する手段を提供することを目的とする [ウォッチ] パッドも使用できます。ブレーク モードでは、ウォッチ ウィンドウは自動的に有効になります。このウィンドウ内をクリックすると、監視する新しいオブジェクトを追加できます。図 10 は、プロパティの値に応じた例を示しています。
図 10 [ウォッチ] パッドでのオブジェクトの監視
監視するオブジェクトごとに、メンバーとその値を確認できます。値をクリックすると変更できるので、別のオブジェクトの値ではコードがどのように動作するかを確認することもできます。[ウォッチ] パッドにはデータ ビジュアライザーへのショートカットもあります。これは、目のアイコンと鉛筆のアイコンで表されています。その他にも 2 つ、[スレッド] パッドと [呼び出し履歴] パッドという非常に便利なパッドがあります (いずれも 図 11 参照)。
図 11 [スレッド] パッドと [呼び出し履歴] パッドによる、スレッドおよびメソッド呼び出しの監視
[スレッド] パッドには、実行中のスレッドの一覧が表示されます。アプリのさまざまなスレッドが一時停止しているコードの場所を把握するうえで役立ちます。ここには、各スレッドを参照しているコードのスレッド ID、名前、および場所が表示されます。また、スレッドに名前が付けられていない場合は、名前を入力できます。[呼び出し履歴] パッドにはメソッド呼び出しの階層が表示されます。相互運用フレームなど、ソリューションに含まれていないコードへの呼び出しを表示させることもできます。それには、パッドを右クリックし、[外部コードの表示] を有効にします。ブレークポイント、[ローカル] パッド、およびデータ ビジュアライザーと併せて、これらすべてを活用することで、.NET Core ソリューションと Xamarin ソリューションをきめ細かく制御できる、包括的で強力なデバッグ ツールのスイートが手に入ります。
まとめ
Visual Studio for Mac は、macOS で Xamarin と .NET Core を使用して、モバイル デバイスおよびクラウド向けのクロスプラットフォーム アプリケーションをビルドできるだけでなく、高品質のコードを書くために必要なすべての生産性向上ツールを提供します。それには、コード エディターとデバッグ ツールの生産性向上機能が含まれ、特に Windows 版の Visual Studio の経験がある場合は、Visual Studio for Mac を抵抗なく利用できるでしょう。
Alessandro Del Soleは 2008 年から Microsoft MVP の一員です。彼は年間 MVP を 5 度受賞し、Visual Studio による .NET 開発に関する、書籍、電子ブック、説明ビデオ、記事を手がけてきました。彼は主に .NET およびモバイル アプリの開発、教育、コンサルティングに取り組む、シニア .NET 開発者として働いています。最近、『Beginning Visual Studio for Mac』 (bit.ly/2hsRxYx、英語) という近日発売予定の書籍を執筆しました。Twitter は、@progalex (英語) からフォローできます。
この記事のレビューに協力してくれたマイクロソフト技術スタッフの Mikayla Hutchinson に心より感謝いたします。