小ネタ休んだついでにピックアップRoslynも。
Visual Studio 2017の正式リリースまではバグ修正くらいしか作業しない段階に来てるんで大したネタはない… と思っていた時期がありました。
まあ、小ネタ程度の話はあった…
whileとforのスコープ変更
まあ、既存動作を壊す変更ではないんですが、while
とfor
の仕様書上の記述を変更しなきゃという話が出ています。
型スイッチとout varのせいで、whileやforの条件式や更新式の中で変数を作れるようになりました。
その変数のスコープはどうなるべきかというのを考えたときに、while
やfor
の展開結果に関する記述をちょっと変更する必要があるっていう話です。
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#に公式に機能追加されるまでのつなぎとしてはいいかも。