はじめに
IDEは何を使っていますか?.NET開発者の方は、おそらくVisual Studioを使っていることでしょう。2017年3月7日、待望の「Visual Studio 2017」が正式リリースされました。
見た目にはそれほど変わっていないように見えますが、数々の新機能が搭載されています。より便利になったVisual Studioを体験してみましょう。
この記事では、Visual Studio 2017に興味があるエンジニアの方のために、VS2017の新機能をピックアップしてお伝えしていきます。魅力的な機能があったら、ぜひ新しいVisual Studioに移行してみましょう。
Visual Studio 2017のインストール
ここでは、無償で使える「Visual Studio Community 2017」を使って説明をしています。オープンソース開発者や個人開発者、5人以下の非エンタープライズ企業開発者なら、無償で使えます。もちろん、上位版の「Professional」や「Enterprise」でも問題ありません。どのバージョンも下記のURLからインストールできます。
Visual Studio 2017:https://www.visualstudio.com/ja/vs/
それではまず、インストーラーの改善点から紹介していきます。
より高速で軽量になったインストール
Visual Studioのデメリットのひとつは、インストールサイズが大きく、時間がかかることでした。また、アンインストールも不便で、専用ツールを使う必要がありました。VS2017ではこの点を改善し、必要な機能のみを選択してインストールできるようになりました。VS2015でも同様の機能がありましたが、より細かく選択できます。
選択しやすいように、用途別に「ワークロード」という単位でインストールがまとめられています。通常はワークロードを選択するだけでOKです。
さらに細かくインストールを制御したい方は、「コンポーネント」単位で選ぶこともできます。どんなコンポーネントがインストールされるか、詳しく知りたい方はこちらを参照しましょう。
また、言語パックのインストールも可能です。デフォルトでは日本語が選択されていますが、他の言語もインストールできます。英語のほうが使いやすい、という方はこちらで変更できます。
なお、インストール後にもう一度インストーラーを起動すると、機能の追加や削除、VS本体のアンインストールが行えます。
実際に起動してみると、起動速度が50%以上高速化されたおかげで、起動時のもっさり感がなくなっています。地味な改善点ですが、うれしいですね。また、スタートページも改良され、スッキリしたデザインで、Gitリポジトリも表示されるようになりました。
C# 7.0とVisual Basic 15の言語拡張
*値タプル
値タプルは、メソッドの引数や返り値で値のペアを使うことができる言語拡張です。これまでもTuple型はありましたが、あまり使い勝手はよくありませんでした。言語拡張とはいうものの、使用するにはNugetパッケージのインストールが必要です。下図のように、「System.ValueTuple」パッケージをインストールします。これは、今後のアップデートにより不要になるかもしれません。
まず、タプルを作成する構文をみてみましょう。なお、この記事では、C#にてサンプルコードを示します。VBでも、同等の処理が可能です。
var tupple1 = (123, "hogehoge"); Console.WriteLine(tupple.Item1); Console.WriteLine(tupple.Item2);
このように、非常にシンプルな構文でタプルを作成できます。要素数は、いくつあってもOKです。現実的には、スタックの制限があるものの、そこまで多くなることはないでしょう。アクセスするときは、Item1..2..3..と自動生成されたプロパティを使います。しかし、既定の名前はわかりにくいため、名前をつける構文も用意されています。
var tupple2 = (num: 123, str: "hogehoge"); Console.WriteLine(tupple.num); Console.WriteLine(tupple.str);
このように、値の前に名前を指定してやると、その名前でプロパティが生成されます。もちろん、IntelliSenseも効くため、入力もスムーズです。また、次のように、タプルを分解して、別々の変数に代入することもできます。
(var num, var str) = (123, "hogehoge");
次は、メソッドの引数として使う方法を見てみましょう。メソッドでは、次のようにシグネチャにタプル型を記述します。
public void Method1((int, string) tupple) { Console.WriteLine(tupple.Item1); Console.WriteLine(tupple.Item2); } Method1((123, "hogehoge"));
引数として受け取った後は、先ほどと同じようにアクセスできます。また、個別の要素に名前をつけることも可能です。
public void Method2((int num, string str) tupple) { Console.WriteLine(tupple.num); Console.WriteLine(tupple.str); }
既定の名前はわかりにくいため、名前をつけたほうが賢明でしょう。最後に、返り値としてタプルを返す構文を見てみましょう。既にお察しかと思いますが、次のようになります。
public (int, string) Method3() { return (123, "hogehoge"); } var tupple3 = Method3(); Console.WriteLine(tupple.Item1); Console.WriteLine(tupple.Item2);
返り値の場合でも、名前をつけて返すことができます。わざわざクラスを作るまでもない値を簡単に返せるので、とても便利ですね。なお、返り値のタプルに名前をつけても無視されます。
public (int num, string str) Method4() { return (123, "hogehoge"); } var tupple4 = Method4(); Console.WriteLine(tupple.num); Console.WriteLine(tupple.str);
*パターンマッチ(C#のみ)
C# 7.0では、is演算子が拡張され、nullや定数、リテラルとの比較に使えるようになった他、型チェック後に変数への割り当てができるようになりました。たとえば、次のような使い方ができます。
object o1 = null; if (o1 is null) Console.WriteLine("null"); object o2 = int.MaxValue; if (o2 is int.MaxValue) Console.WriteLine("max"); object o3 = "hogehoge"; if (o3 is "hogehoge") Console.WriteLine("hogehoge"); object o4 = 123; if (o4 is int i) Console.WriteLine(i);
これを利用すると、次のようにnullチェックを省略することもできます。nullの場合には、falseが返され、if文は実行されません。tureが返されたときのみ、変数への割当が行われます。if文の外からは、宣言した変数にアクセスできません。
int? num = 123; if (num is int i1) Console.WriteLine(i1); object o = null; if (o?.GetHashCode() is int i2) Console.WriteLine("not call");
また、switch構文に関数型言語のようなパターンマッチ構文が取り入れられました。定数以外にも、型とマッチさせることができ、ガード条件も指定可能です。
object o = new List{ "hogehoge" }; switch (o) { case string s: Console.WriteLine(s); break; case int i: Console.WriteLine(i); break; case List l when (l.Count > 0): Console.WriteLine(l.First()); break; }
なお、変数名は必須なので、割り当てが不要な場合は、アンダーバー(_)を代わりに使用します。関数型っぽくスマートに書けて、コードも短縮できますね。
リファクタリング機能の強化
以前からあったリファクタリング機能が更に強化され、C# 7.0で追加された構文を使った新しいリファクタリング方法が追加されています。たとえば、out変数宣言のインライン化やnullチェックと例外スロー式の単純化などです。他にも、別ファイルへの型の移動やファイル名と型名の同期、タイプミスの修正など、ありがちな修正をサポートし、コーディング時間を削減してくれます。
IntelliSense候補のフィルタリングの追加
IntelliSenseは、これまでも十分機能的でしたが、新しくフィルタリングの機能が追加されました。クラスや変数、メソッド、プロパティなど、種類ごとにトグルボタンが用意され、オンにすると任意の種類のメンバのみを表示できるようになりました。クリック、またはキーボードショートカットでオンオフ可能です。大規模なコードベースで、メンバを探索しつつコーディングする際に役立ちそうですね。
.NET CoreとASP.NET Coreのサポート
これまで.NET Frameworkは、基本的にWindows専用でした。しかし、MonoプロジェクトやXamarinの登場によって、この状況は変わりつつあります。そして、ついにマイクロソフトも重い腰を上げ、.NET Frameworkのクロスプラットフォーム化に乗り出しました。
.NET Coreは、その成果の一つです。Windowsだけでなく、LinuxやMacでも動作します。これまでの.NET Frameworkの後継という位置づけではなく、Windowsに依存する部分を取り除いたサブセットのようなものです。少なくとも、.NET Coreが成熟するまでは並行して開発されていくでしょう。
もうひとつ、ASP.NET Coreもサポートされています。これは、ASP.NETのクロスプラットフォーム版といえるものです。.NET Core上で動作し、IIS以外のWebサーバーでも扱えるようになっています。ASP.NET MVCがベースになっているため、WebFormはサポートされていません。また、クラス群も再設計され、プロジェクトの管理方法も異なるため、単純な移行はできません。これまでのASP.NETとは、別物と考えておいたほうがよいでしょう。
まとめ
新しいVisual Studioはいかがでしたか?大きな変更はないものの、今までの不満点を改善する堅実なバージョンアップといえるでしょう。特に、C#やVisual Basicの新しい言語機能はぜひ使ってみたいですね。とはいえ、多くの方は今のバージョンから急に移行するのは不安でしょう。幸い、Visual Studioは複数バージョンの共存が可能です。今のバージョンをアンインストールしなくても、VS2017をインストールできます。とりあえずインストールして使ってみましょう。
本ブログは、Git / Subversion のクラウド型ホスティングサービス「tracpath(トラックパス)」を提供している株式会社オープングルーヴが運営しています。
開発の効率化をしたい!もっと便利なツールを使いたい!そんなお悩みをtracpathで解決!
「tracpath(トラックパス)」は、企業内の情報システム部門や、ソフトウェア開発・アプリケーション開発チームに対して、開発の効率化を支援し、品質向上を実現します。
さらに、システム運用の効率化・自動化支援サービスも提供しています。
”つくる情熱を支えるサービス”を提供し、まるで専属のインフラエンジニアのように、あなたのチームを支えていきます。
No Comments