Visual Studio 2017 RCをインストールしてみました

こんにちはー!ニアです。

先日、Visual Studio 2017 RCがリリースされましたね。

Visual Studio 2017 リリース ノート – Microsoft

Xamarin StudioVisual Studio for Macになったり、IntelliSenseがさらに強化されたりと色々話題になっていますが、C#を普段使用している私にとっては、次期バージョンのC# 7.0が楽しみです。

早速私は、PCにインストールしてみました。

1. Visual Studio 2017 RCのインストーラーは軽量タイプ

そういえば、Visual Studio 15 Previewをインストールする時、インストーラーは従来タイプ軽量タイプかを選べるのでしたね。ちなみに私は軽量タイプ(下図)を選択しました。

vs15-3

Visual Studio 2017 RCのインストーラーはどちらかというと、軽量タイプでした。

vs2017rc-3

2. Visual Studio 2017 RCをインストール

vs2017rc-1

2.1. 開発スタイルに合わせて、機能やコンポーネントなどを選択

Visual Studio 2017 RCのインストーラーを起動すると、インストールする機能やコンポーネントの選択画面が現れます。「ワークロード」では、開発するアプリに必要な機能を選択します。

機能はいくつかグループに分かれており、「Windows」グループには、

  • ユニバーサルWindowsプラットフォーム(UWP)開発
  • .NET デスクトップ開発(WPF、Windowsフォームアプリ、コンソールアプリ)
  • Desktop development with C++(C++によるデスクトップアプリ(MFC、ATL、Microsoft C++)開発)

が含まれています。主にWindowsアプリの開発向けですね。

vs2017rc-3

Nia02.png
ということは、C言語でHello Worldのプログラムを書く時は、「Desktop development with C++」にチェックを入れればOKですな。

Web & クラウド」には、

  • Web 開発(ASP.NET)
  • Azure の開発
  • Python 開発
  • Node.js 開発
  • データベースの保存と処理
  • データサイエンスと解析のアプリケーション(言語はPythonやR、F#)
  • Office SharePoint 開発

が含まれています。

vs2017rc-4

モバイル & ゲーム」には、

  • .NET によるモバイル開発(Xamarin)
  • Unity によるゲーム開発
  • JavaScriptによるモバイル開発
  • C++ によるモバイル開発
  • C++ によるゲーム開発(DirectXやCocos2d)

が含まれています。

vs2017rc-5

Nia12.png
Xamarinをインストールしたい場合、「.NET によるモバイル開発」にチェックだぞい!

「他のツールセット」には

  • Visual Studio 拡張機能の開発
  • C++ によるLinux 開発

が含まれています。

Nia10.png
ついにVisual StudioでLinux用アプリが作れるとは、胸熱です!

デバッグはBash on Ubuntu on Windowsで行うのかな?

コンポーネント」タブでは、インストールするフレームワークや外部ツールを選択します。

vs2017rc-8

2.2. あれ、インストールできない!?

では早速、UWPや.NET、Xamarinなどを選択して、レッツ、インストール!・・・って、あれ?

vs2017rc-7

Nia08.png
「インストール」ボタンがグレーアウトして押せない!

Visual Studio 15 Previewをインストールしていた場合、それをアンインストールしてからVisual Studio 2017 RCをインストールしましょう。

私の環境では、なぜかVisual Studio 15 Previewのアンインストーラーが行方不明でした。ということでフォルダーの名前を、以前のWindowsフォルダーがWindows.oldと名付けられることに倣い、VS15Preview.oldに変えました。

vs2017rc-10

すると、「インストール」ボタンが有効になりました。よし、これでインストールができるぞい!

vs2017rc-11

「インストール」ボタンを押すと、Visual Studio 2017 RCをインストールします。

vs2017rc-14

進行状況画面の右側には、虎の巻みたいなものが表示されています。

2.3. Visual Studio 2017 RCを起動

インストールが完了したら、早速Visual Studioを起動します。

※初めて起動した場合、開発者サービスにサインインするかどうかのダイアログが現れます。

vs2017rc-16

UIは、Visual Studio 2012、2013、2015とほぼ同じですね。

vs2017rc-19

3. C# 7.0の新機能にトライ

Visual Studio 15 Previewをインストールした時では、「ローカル関数」と「2進数リテラル」について扱いました。

今回は、「タプル型」及び「switch文によるパターンマッチング」について扱います。

Nia02.png
RCでは、「条件付きコンパイル シンボル」に「__DEMO__」を入力せずに、C# 7.0の機能が利用できますよ。

3.1. タプル型

例えば、2つの値を受け取り、商と余剰を返すメソッドを作るとします。

C# 6.0までは、メソッドから複数の値を返す時

  • .NETのTupleクラス(System名前空間内)を利用する
  • 2つの値を格納する構造体 or クラスを定義
  • out付きの引数を利用する

などで実装していました。

using System;

struct QR {
	public int q, r;
}

class Proram {
	// Tuple<T1, T2>クラス
	static Tuple<int, int> Div1( int dd, int dr ) =>
		new Tuple<int, int>( dd / dr, dd % dr );

	// 構造体やクラスを定義
	static QR Div2( int dd, int dr ) =>
		new QR{ q = dd / dr, r = dd % dr };

	// out付きの引数
	static void Div3( int dd, int dr, out int q, out int r ) {
		q = dd / dr;
		r = dd % dr;
	}
	
	static void Main( string[] args ) {
		int a = 20, b = 3;
		
		var qrt = Div1( a, b );
		
		var qrt = Div2( a, b );
		
		int oq, or;
		Div3( a, b, out oq, out or );
	}
}

C# 7.0のタプル型(ValueTuple構造体)を利用すると、メソッドから複数の値を返すことができます。

using System;

class Program {

	static ( int q, int r ) Div4( int dd, int dr ) =>
		( dd / dr, dd % dr );

	static void Main( string[] args ) {
		int a = 20, b = 3;

		// タプル型オブジェクトを1つの変数に格納します。
		var c = Div4( a, b );
		Console.WriteLine( $"{a} / {b} = {c.q} ... {c.r}" );

		// 代入先をメンバーごとに分解して代入することもできます。
		var ( q, r ) = Div4( a, b );
		Console.WriteLine( $"{a} / {b} = {q} ... {r}" );
	}
}

タプル型の変数に代入すると、対応するメンバーにそれぞれ値が代入されます。また、代入先のメンバーには、宣言済みの変数を指定することもできます。

using System;

class Program {

	static ( int q, int r ) Div4( int dd, int dr ) =>
		( dd / dr, dd % dr );

	static void Main( string[] args ) {
		int a = 20, b = 3;

		// 宣言済みのタプル型変数を左辺に置くと、対応するメンバーにそれぞれ代入されます。
		// ここでは、c.q = Div4( a, b ).q, c.r = Div4( a, b ).r
		( int q, int r ) c;
		c = Div4( a, b );
		Console.WriteLine( $"{a} / {b} = {c.q} ... {c.r}" );

		// タプル型のメンバーと同じ型であれば、宣言済みの変数に代入することもできます。
		int q, r;
		( q, r ) = Div4( a, b );
		Console.WriteLine( $"{a} / {b} = {q} ... {r}" );
	}
}

.NETのTupleクラスやout付き引数には、いくつかの問題点がありましたが、C# 7.0のタプル型では、それらの問題を解決することができます。

  問題点 C# 7.0のタプル型で解決できること
.NETのTupleクラスを利用
  • インスタンスの初期化時に、すべてメンバーに値を割り当てる必要がある
  • メンバーの名前は、Item1Item2、・・・と可読性がイマイチ
  • 各メンバー(Item1、Item2、・・・)は、getのみのプロパティなので、読み取り専用
  • 変数の宣言だけをして、必要に応じてメンバーに値を代入することができます。
  • タプル型の各メンバーには、プログラマーが自由に名前を決めることができます。また、Item1、Item2、・・・で対応するメンバーにアクセスできます(おそらく、Tupleクラスとの互換性確保のためだと思います)。
  • 各メンバーは、getとsetのプロパティなので、値の読み書きができます。
専用の構造体やクラスを定義 複数の値を返すためだけの構造体やクラスが乱立してしまう 複数の値を返すためだけの構造体やクラスが不要になり、汎用性の低い構造体やクラスを乱立するのを防ぐことができます。
out付き引数を利用 メソッド内では、非同期メソッドが呼び出せない out付き引数の代わりにタプル型のメンバーとして返すことで、out付き引数が不要になり、メソッド内で非同期メソッド呼び出せるようになります。

なお、Visual Studio 2017 RCでタプル型を利用する場合、NuGetパッケージ「System.ValueTuple」をインストールする必要があります。

vs2017rc-20

ちなみにF#では、以下のように表すことができます。

let div ( dd :int ) ( dr :int ) = ( dd / dr, dd % dr )

let a = 20
let b = 3

let c = div a b
printfn "%d / %d = %d ... %d" a b ( fst c ) ( snd c )

let ( q, r ) = div a b
printfn "%d / %d = %d ... %d" a b q r
Nia03.png
C#のタプル型は、F#のものより便利だな~
Myoga14.png
F#マニアなわたしはちょっと悔しいですー

3.2. switch文によるパターンマッチング

例えば、テストの点数でランクを求めるプログラムを作るとします。

using System;

class Program {

	static void Main( string[] args ) {
		int score = int.Parse( Console.ReadLine() );
		
		switch( score / 10 ) {
			// 0~59 : D
			case 0:
			case 1:
			case 2:
			case 3:
			case 4:
			case 5:
				Console.WriteLine( "D" );
				break;
			// 60~69 : C
			case 6:
				Console.WriteLine( "C" );
				break;
			// 70~89 : B
			case 7:
			case 8:
				Console.WriteLine( "B" );
				break;
			// 90~99 : A
			case 9:
				Console.WriteLine( "A" );
				break;
			// 100~109 : S
			case 10:
				Console.WriteLine( "S" );
				break;
			default:
				Console.WriteLine( "N/A" );
				break;
		}
	}
}

C# 7.0では、switch文内のcase文が拡張され、データの型や値の範囲を指定してパターンマッチングできるようになりました。

「case 0:」~「case 5:」の部分を、まとめて1つのint型変数に代入し、when句で条件判定します。

using System;

class Program {

	static void Main( string[] args ) {
		int score = int.Parse( Console.ReadLine() );
		
		switch( score / 10 ) {
			case int r when r >= 0 && r <= 5:
				Console.WriteLine( "D" );
				break;
			case 6:
				Console.WriteLine( "C" );
				break;
			case 7:
			case 8:
				Console.WriteLine( "B" );
				break;
			case 9:
				Console.WriteLine( "A" );
				break;
			case 10:
				Console.WriteLine( "S" );
				break;
			default:
				Console.WriteLine( "N/A" );
				break;
		}
	}
}
Myoga09.png
where句を見てると、まるでF#のmatch式みたいだよー
match score / 10 with
| r when r >= 0 && r <= 5 -> printfn "D"
| 6 -> printfn "C"
| 7 | 8 -> printfn "B"
| 9 -> printfn "A"
| 10 -> printfn "S"
| _ -> printfn "N/A"

4. おわりに

今回は、Visual Studio 2017 RCをインストールし、C# 7.0の新機能を新たに2つ利用してプログラミングをしてみました。

Visual Studio 15 Previewで扱ったローカル関数や、今回扱ったタプル型とパターンマッチングなど、F#での便利な機能がC#でも利用可能になったのが魅力的ですね。RTM版のリリースが楽しみです。

今度はLinuxアプリでも作ってみようかな。

それでは、See you next!

参考サイト

更新履歴

  • 2016/11/28 : .NETのTupleクラスやout付き引数を利用した時の問題点と、タプル型を利用することで解決できることを表形式にまとめました。また、タプル型のサンプルコードを1つ追加しました。
この記事をシェアする
Chronoir.netのRSSフィードを購読する

ニア(Nia)

サーバー・フロント・DB・インフラ(クラウド)エンジニア(目指すはフルスタック)。主にC#/PHPを使っています。最近はDockerやWebアプリ、モバイルアプリ開発(Xamarin)を探求中。好物は紅茶とコーヒー、シラス丼、趣味は写真撮影と音ゲーです

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください