Visual Studio 15 Previewをちょっと試してみる

Nia-TN-SDF-A2

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

最近、Xamarinが無料になりましたね! 来年に大学院を卒業しても、ずっとVisual Studio+C#でAndroidやiOSアプリを無料で開発できるのはうれしいです!

ところで今日、Visual Stduioのスタートページにあるニュースに「Visual Studio 15 Previewが利用可能」という項目を見て、最新のC# 7.0の一部に対応しているということで、ちょっとインストールしてプログラミングしてみました。

1. 新しいVSにはインストーラーが2種類あります

Visual Studio 15 Previewには従来からあるインストーラーと、下の図のような軽量タイプのインストーラーの2種類があります。

vs15-6

必須であるコアエディターの他、.NETデスクトップアプリ開発やUnityを使ったゲーム開発、C++を使ったアプリ開発、Pythonを使った開発など、開発したいものに合わせた追加コンポーネントをインストールするスタイルですね。

2. 早速インストールしてみました

まずは、軽量タイプのインストーラーをダウンロードして起動し、「Install」ボタンをクリックします。

vs15-1
vs15-2

インストールしたい追加のコンポーネントのチェックボックスをオンにし、インストール先を設定して「Install」ボタンをクリックします。

vs15-3

インストールが終わるまで待機します。

vs15-4
vs15-5

インストールが完了すると、インストール済みのコンポーネントに「Installed」のマークが付きます。ここからインストール済みのコンポーネントをアンインストールしたり、他のコンポーネントをインストールしたりすることができます。

「Lanch」ボタンをクリックすると、Visual Studio 15 Previewが起動します。

vs15-6
vs15-7

こちらがVisual Studio 15 Previewのスタートページです。スタイルはVisual Studio 2015とほぼ同じですね。

vs15-9

また、アイコンの無限大マークがスリムになっています。(左がVisual Studio 2015のアイコン、右がVisual Studio 15 Previewのアイコンです)

vs15-10

Blendの方ははどうなっているのでしょう。

3. C# 7.0の新機能を使ってみよう

さて、お楽しみはここからです。Visual Studio 15 Previewから利用可能になったC# 7.0の新機能を使ってみましょう。

vs15-11

このPreviewの時点で利用できるC# 7.0の機能は以下の4つです。

  • ローカル関数
  • パターンマッチング
  • 戻り値にrefキーワードを使用
  • 2進数リテラル

今回は上の4つの内、ローカル関数と2進数リテラルについて試してみました。

3.1. C# 7.0を使用する前に

現時点ではC# 7.0はFutureブランチ扱いなので、使用する時は「__DEMO__」のシンボルを有効にする必要があります。

プロジェクトのプロパティページから、「Build」(ビルド)→「General」(全般)にある「Conditional compilation symbols」(条件付きコンパイル シンボル)の欄に「__DEMO__」を追加します。

vs15-12

3.2. ローカル関数

今まではクラスのメンバーまたはラムダ式で、メソッドを定義していましたね。

using System;

namespace ConsoleApplication1 {

	class Program {

		// 指定したnの階乗を求めます。
		static int Fact( int n ) =>
			n > 0 ? n * Fact( n - 1 ) : 1;

		static void Main( string[] args ) {

			// メンバーメソッドとして定義したFactメソッドを呼び出し、5の階乗を求めて出力します。
			Console.WriteLine( $"5! = {Fact( 5 )}" );
		}
	}
}

C# 7.0のローカル関数では、メソッドや演算の中で別のメソッドを定義することができます。例えば、上のプログラムの場合、Programクラスのメンバーとして定義していたFactメソッドを、Mainメソッドの中で定義することができます。

using System;

namespace ConsoleApplication1 {

	class Program {

		static void Main( string[] args ) {

			// 指定したnの階乗を求めます。
			int Fact( int n ) =>
				n > 0 ? n * Fact( n - 1 ) : 1;

			// ローカル関数として定義したFactメソッドを呼び出し、5の階乗を求めて出力します。
			Console.WriteLine( $"5! = {Fact( 5 )}" );
		}
	}
}

気を付けておきたい点は2つあり、1つはローカル関数の定義の文末にセミコロンを付ける必要があること、もう1つはローカル関数を呼び出す位置よりも前に定義する必要があることです。以下のように、ローカル関数の呼び出す位置より後に定義した場合、コンパイルエラー(識別子が未定義)になります。

// 注:このコードはコンパイルエラーになります。
using System;

namespace ConsoleApplication1 {

	class Program {

		static void Main( string[] args ) {

			// ローカル関数として定義したFactメソッドを呼び出し、5の階乗を求めて出力します。(注:コンパイルエラー(CS0841)になります)
			Console.WriteLine( $"5! = {Fact( 5 )}" );

			// 指定したnの階乗を求めます。
			int Fact( int n ) =>
				n > 0 ? n * Fact( n - 1 ) : 1;
		}
	}
}

また、ローカル関数の前に宣言された変数などを、ローカル関数の中で使用することもできます。

using System;

namespace ConsoleApplication1 {

	class Program {

		static void Main( string[] args ) {

			// デバッグ用フラグ
			bool isDebug = true;

			// 指定したnの階乗を求めます。
			int Fact( int n ) {
				if( isDebug ) {
					Console.WriteLine( $"{nameof( n )} = {n}" );
				}
				return n > 0 ? n * Fact( n - 1 ) : 1;
			}

			// ローカル関数として定義したFactメソッドを呼び出し、5の階乗を求めて出力します。
			Console.WriteLine( $"5! = {Fact( 5 )}" );
		}
	}
}

3.3. 2進数リテラル

C# 7.0では、2進数の表記がサポートされています。数値の前に「0b」と付けることで、2進数として表すことができます。

using System;

namespace ConsoleApplication1 {

	class Program {

		static void Main( string[] args ) {

			// 2進数リテラルで変数を初期化します。
			int a = 0b1010, b = 0b1100;

			// aとbとの論理演算をします。
			Console.WriteLine( $"{a:X1}" );
			Console.WriteLine( $"{b:X1}" );
			Console.WriteLine( $"{a & b:X1}" );
			Console.WriteLine( $"{a | b:X1}" );
			Console.WriteLine( $"{a ^ b:X1}" );
		}
	}
}

またC# 7.0には、「数値セパレーター」という機能があり、数値リテラルの任意の位置にアンダーパー「_」で区切ることができます。例えば、2進数であれば4ビットごとに区切ったり、16進数であれば、2バイトごとに区切ったりと、ソースコードをより見やすくすることができます。

int bin = 0b0000_1111;	// (0b00001111と等価です。)
int dec = 123_456_789;	// (123456789と等価です。)
int hex = 0xABCD_EF01;	// (0xABCDEF01と等価です。)

4. おわりに

今回はVisual Studio 15 Previewをインストールし、C# 7.0の新機能について少し触れてみました。C++やPythonの機能は、後日時間がある時に試してみようと思います。

[END]

参考サイト

コメント

タイトルとURLをコピーしました