小ネタ休んだついでにピックアップRoslynも。

Visual Studio 2017の正式リリースまではバグ修正くらいしか作業しない段階に来てるんで大したネタはない… と思っていた時期がありました。

まあ、小ネタ程度の話はあった…

whileとforのスコープ変更

まあ、既存動作を壊す変更ではないんですが、whileforの仕様書上の記述を変更しなきゃという話が出ています。

型スイッチout varのせいで、whileやforの条件式や更新式の中で変数を作れるようになりました。 その変数のスコープはどうなるべきかというのを考えたときに、whileforの展開結果に関する記述をちょっと変更する必要があるっていう話です。

while

まずwhile

while (<cond>) <body>

こういうwhileステートメントがあったとき、これまでだと、以下のように展開するという仕様になっていました。

continueLabel:;
if (!<cond>) goto breakLabel;
{
    <body>
}
goto continueLabel;
breakLabel:;

これが、以下のように変わります。{ } が1段増える。

continueLabel:;
{
    if (!<cond>) goto breakLabel;
    {
        <body>
    }
    goto continueLabel;
}
breakLabel:;

要するに、条件式の中で宣言された変数は、whileの外には漏らさないよというルールの追加です。

(現状のRC版はルール変更前の実装になってる。RTMまでにたぶん変わる。)

for

同様に、for

for (<decl>; <cond>; <incr>) <body>

このforステートメントは、以下のような仕様になっていました。

{
    <decl>
    while(<cond>)
    {
        <body>
    continueLabel:;
        <incr>
    }
}

これが以下のように変更。更新式(<incr>のところ)に { }が増えます。

{
    <decl>
    while(<cond>)
    {
        <body>
    continueLabel:;
        { <incr> }
    }
}

更新式のところで宣言した変数はその中でだけ使えて、forステートメントのbody内でも参照できなくするということのようです。

Design by Contract のコミュニティ実装

C# チーム的には「メリットの割には構文が煩雑になりすぎる」と、今まだちょっと及び腰になっている Design by Contract がらみの構文ですが、 しびれを切らした人が自前実装を始めた模様。

実装的には、StackExchange.Precompilationを使ったビルド時コード書き換えみたいです。なので、実行時コストは高くないはず。

まあ、ビルド時コード書き換えはそこそこはまりどころもあるので、どうしてもDbCが欲しいという人にしかあんまりお勧めはできませんけども… C#に公式に機能追加されるまでのつなぎとしてはいいかも。