こんにちはー!ニアです。
先日、Visual Studio 2017 RCがリリースされましたね。
Visual Studio 2017 リリース ノート – Microsoft
Xamarin StudioがVisual Studio for Macになったり、IntelliSenseがさらに強化されたりと色々話題になっていますが、C#を普段使用している私にとっては、次期バージョンのC# 7.0が楽しみです。
早速私は、PCにインストールしてみました。
1. Visual Studio 2017 RCのインストーラーは軽量タイプ
そういえば、Visual Studio 15 Previewをインストールする時、インストーラーは従来タイプか軽量タイプかを選べるのでしたね。ちなみに私は軽量タイプ(下図)を選択しました。
Visual Studio 2017 RCのインストーラーはどちらかというと、軽量タイプでした。
2. Visual Studio 2017 RCをインストール
2.1. 開発スタイルに合わせて、機能やコンポーネントなどを選択
Visual Studio 2017 RCのインストーラーを起動すると、インストールする機能やコンポーネントの選択画面が現れます。「ワークロード」では、開発するアプリに必要な機能を選択します。
機能はいくつかグループに分かれており、「Windows」グループには、
- ユニバーサルWindowsプラットフォーム(UWP)開発
- .NET デスクトップ開発(WPF、Windowsフォームアプリ、コンソールアプリ)
- Desktop development with C++(C++によるデスクトップアプリ(MFC、ATL、Microsoft C++)開発)
が含まれています。主にWindowsアプリの開発向けですね。
「Web & クラウド」には、
- Web 開発(ASP.NET)
- Azure の開発
- Python 開発
- Node.js 開発
- データベースの保存と処理
- データサイエンスと解析のアプリケーション(言語はPythonやR、F#)
- Office SharePoint 開発
が含まれています。
「モバイル & ゲーム」には、
- .NET によるモバイル開発(Xamarin)
- Unity によるゲーム開発
- JavaScriptによるモバイル開発
- C++ によるモバイル開発
- C++ によるゲーム開発(DirectXやCocos2d)
が含まれています。
「他のツールセット」には
- Visual Studio 拡張機能の開発
- C++ によるLinux 開発
が含まれています。
デバッグはBash on Ubuntu on Windowsで行うのかな?
「コンポーネント」タブでは、インストールするフレームワークや外部ツールを選択します。
2.2. あれ、インストールできない!?
では早速、UWPや.NET、Xamarinなどを選択して、レッツ、インストール!・・・って、あれ?
Visual Studio 15 Previewをインストールしていた場合、それをアンインストールしてからVisual Studio 2017 RCをインストールしましょう。
私の環境では、なぜかVisual Studio 15 Previewのアンインストーラーが行方不明でした。ということでフォルダーの名前を、以前のWindowsフォルダーがWindows.oldと名付けられることに倣い、VS15Preview.oldに変えました。
すると、「インストール」ボタンが有効になりました。よし、これでインストールができまする!
「インストール」ボタンを押すと、Visual Studio 2017 RCをインストールします。
進行状況画面の右側には、虎の巻みたいなものが表示されています。
2.3. Visual Studio 2017 RCを起動
インストールが完了したら、早速Visual Studioを起動します。
※初めて起動した場合、開発者サービスにサインインするかどうかのダイアログが現れます。
UIは、Visual Studio 2012、2013、2015とほぼ同じですね。
3. C# 7.0の新機能にトライ
Visual Studio 15 Previewをインストールした時では、「ローカル関数」と「2進数リテラル」について扱いました。
今回は、「タプル型」及び「switch文によるパターンマッチング」について扱います。
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クラスを利用 |
|
|
専用の構造体やクラスを定義 | 複数の値を返すためだけの構造体やクラスが乱立してしまう | 複数の値を返すためだけの構造体やクラスが不要になり、汎用性の低い構造体やクラスを乱立するのを防ぐことができます。 |
out付き引数を利用 | メソッド内では、非同期メソッドが呼び出せない | out付き引数の代わりにタプル型のメンバーとして返すことで、out付き引数が不要になり、メソッド内で非同期メソッド呼び出せるようになります。 |
なお、Visual Studio 2017 RCでタプル型を利用する場合、NuGetパッケージ「System.ValueTuple」をインストールする必要があります。
ちなみに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
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;
}
}
}
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アプリでも作ってみようかな。
[END]
コメント