忍者ブログ
おそらく活動状況とか、他愛もないこととか書きます。 μ崎みのりの気ままで気まぐれなブログです。 作曲とか、ゲーム製作なんかしてます。
[578]  [577]  [576]  [575]  [574]  [573]  [572]  [571]  [570]  [569]  [568
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

Visual Studio 2015 RC版がいつの間にか日本語化できるようになっていたので、
さっそく導入してみました。
今さらですがProfessional相当の機能を個人開発者等に無償提供って大丈夫なのか、Microsoft。
(と言っていますが、Visual C# Express 2010 からの乗り換えです。実に5年越し)

理由としてはさすがにasync / awaitが使いたくなったのと、
C#6.0で便利な糖衣構文が色々追加されたから。

まず起動して…ソリューションエクスプローラでクラスやメソッド定義が見えるようになっていることに感動(もしかしたら以前のバージョンで既に追加されていたのかもしれませんが)。

詳細は公式に任せるとして(「++C++; // 未確認飛行 C」さんのこのページのほうが分かりやすいです)、新しい糖衣構文使ってみた印象をレビューします。

【式形式のメソッド / プロパティ / インデクサ】
コーディングに一番影響しそうなのがこれです。
プロパティやメソッドの実装が1ステートメントだけな場合、ラムダ式とほぼ同じ記法で書けるようになりました。
特に読み取り専用プロパティ / インデクサでは get ブロックそのものを省けるため、効果は絶大。
ただメソッドに対しては乱用に注意しないといけないなーと思いました。
理由は return を省けるため、パッと見で戻り値があるのかないのか一瞬迷うこと。
ようするに、beforeではreturnの有無でパッと分かっていたのが、afterではそれが省略されたせいで戻り値の型を見ないと戻り値の有無が分かりません。

before:
int MyProperty { get { return x; } }
int MyMethod1() { return OtherMethod(); }
void MyMethod2() { OtherMethod(); }


after:
int MyProperty => x;
int MyMethod1() => OtherMethod();
void MyMethod2() => OtherMethod();


…というわけで私は、戻り値がない場合にはこの構文は使わないことに決めました(たしか公式も「副作用のない式」の場合に使うことを想定していたはず)。
文字数も空白が1文字分少なくなるだけですしね。

μ崎スタイル(voidの時は式形式を使わない):
int MyProperty => x;
int MyMethod1() => OtherMethod();
void MyMethod2() { OtherMethod(); }


【自動実装プロパティの強化 (getのみの自動実装プロパティ / プロパティ初期化子)】
getのみのほうは私が待ちに待っていた機能です。
C#が関数指向に近づくにつれ、書く頻度が高まっていたであろう不変オブジェクトがこれで書きやすくなります。
対してプロパティ初期化子は、プライマリーコンストラクタがC#6.0 から省かれたこともあって使用頻度はやや低め。
不要なコンストラクタを書かなくて良くなりますね。

【nameof演算子】
Visual Studioがあってこその機能ですね。
頻出するArgumentNullExceptionで主にお世話になります。
WPF(本質的にはMVVM)だとINotifyPropertyChangedの実装には[CallerMemberName]属性が使えるので今さら感がありますが、依存関係プロパティも恩恵を受けるのでなかなか効果的。

【null条件演算子 (?. 演算子 ・ ?[ ] 演算子)】
これも多くの開発者に望まれていたであろう機能。
null合体演算子 ?? と並んで、うまくnullと付き合っていくためにとても都合がいいものです。
私もイベントの呼び出し等で早速使いました。

【文字列挿入】
string.Formatメソッドに対応する糖衣構文。
string.Formatって打つのが面倒で文字列を + 演算子で結合していた場面でも効果を発揮しています。
無駄なバグも減るいい機能ですが、作成するプログラムによっては全く使わなかったり…。

【using static】
まだ使ったことはありません。
拡張メソッドが省略できる対象に含まれないあたりは良いと思います。
System.Linq.EnumerableのRange・Repeatあたりが使いやすくなりそう。

【オブジェクト初期化子の強化 (インデックス初期化子 / Add拡張メソッドへの対応)】
主にDictionaryで効果を発揮しますね。
同じことができる2引数のAddメソッドと比べると、波カッコが減って見やすくなります。
拡張メソッドのほうは、Stackとかで初期化子を使いたい時に便利そう。

【例外フィルター】
これもまだ使ったことはありません。高度な例外処理では必要になるんでしょうか。
個人的には、キーワードがwhenなのがちょっと疑問。F#との兼ね合いですかねぇ。
英語として多少おかしくても、意味が分かりやすいifにしてほしかったなーと。

【catch・finallyブロック内でawait】
そもそもこのバージョンからasync / awaitを使い始めた私にはレビューしようがありません…。

【おまけ・async / await】
そもそもawait演算子はAwaitableパターンを実装していれば(一応)どんなクラスにも対応可能です。
これを応用して、ゲームプログラミングでフレームをまたぐ処理を書きやすくすることができます。
UnityだとIEnumerableを用途外に使用して強引にコルーチンを実装していましたが、awaitのパターンを使えばもうちょっとそれっぽく書けるようになります。
もっとも、Unitiyではasync / awaitを使うことができませんが…。
PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
忍者ブログ [PR]