こんにちはー!ニアです。
最近、Xamarinが無料になりましたね! 来年に大学院を卒業しても、ずっとVisual Studio+C#でAndroidやiOSアプリを無料で開発できるのはうれしいです!
ところで今日、Visual Stduioのスタートページにあるニュースに「Visual Studio 15 Previewが利用可能」という項目を見て、最新のC# 7.0の一部に対応しているということで、ちょっとインストールしてプログラミングしてみました。
1. 新しいVSにはインストーラーが2種類あります
Visual Studio 15 Previewには従来からあるインストーラーと、下の図のような軽量タイプのインストーラーの2種類があります。
必須であるコアエディターの他、.NETデスクトップアプリ開発やUnityを使ったゲーム開発、C++を使ったアプリ開発、Pythonを使った開発など、開発したいものに合わせた追加コンポーネントをインストールするスタイルですね。
2. 早速インストールしてみました
まずは、軽量タイプのインストーラーをダウンロードして起動し、「Install」ボタンをクリックします。
インストールしたい追加のコンポーネントのチェックボックスをオンにし、インストール先を設定して「Install」ボタンをクリックします。
インストールが終わるまで待機します。
インストールが完了すると、インストール済みのコンポーネントに「Installed」のマークが付きます。ここからインストール済みのコンポーネントをアンインストールしたり、他のコンポーネントをインストールしたりすることができます。
「Lanch」ボタンをクリックすると、Visual Studio 15 Previewが起動します。
こちらがVisual Studio 15 Previewのスタートページです。スタイルはVisual Studio 2015とほぼ同じですね。
また、アイコンの無限大マークがスリムになっています。(左がVisual Studio 2015のアイコン、右がVisual Studio 15 Previewのアイコンです)
Blendの方ははどうなっているのでしょう。
3. C# 7.0の新機能を使ってみよう
さて、お楽しみはここからです。Visual Studio 15 Previewから利用可能になったC# 7.0の新機能を使ってみましょう。
この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__」を追加します。
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]
コメント