Archive for 6月 2014
C#/.NET Framework がやっていること 第二版
OnDrive: http://1drv.ms/1yYjUNf
前に、Boost勉強会で話した内容の焼き直し。その時は180ページ近い資料を1時間(通常の3倍速)で話したわけですが、それを3時間かけてちゃんと話したいとか言っていたら、CLR/Hにお呼ばれしたもの。本当に3時間(というか、ちょっと時間オーバーしたんで3時間以上)話してきました。
時間があるのと求める前提知識をだいぶ緩くしたのとで、追記が結構ある。あと、5月の非同期勉強会の内容も少しマージしたのと、.NET vNextがらみの話題も足して、最終的には210ページ超。
Visual Studio 2014 CTP
Visual Studio 2014 CTPのプレビュー版出てた。
2013とside-by-sideで入らないとのことでちょっとさすがに触れずにいたものの、1日遅れでAzure VM Galleryに並ぶようになったんでそちらを使ってVM上で試すことに。
MSDNブログ情報
MSの各製品チームとかから一斉に情報が。
side-by-side不可
もちろん最終的には他のバージョンのVisual Studioと共存できるようにするつもりだけども、今回は不具合が残っててできないということみたい。そのうち治るはず。
今は、そもそも別のバージョンが入っていたらインストーラーが警告出して止まる。回避方法もあるものの、VS 2014 CTPをインストールしてアンインストールすると、VS 2013とかに悪影響を残すとか。
C# 6.0 experimental
//build/ の前後で出た状態のRoslyn CTP以降、null伝搬 . 演算子が実装されたみたいですね。
null伝搬
以下のようなもの。要するに、p == null ? null : p.Name の短縮形。
using System;
class Program
{
static void Main(string[] args)
{
X(null);
X(new Point(1, 2, null));
X(new Point(1, 2, "aaa"));
}
static int? X(Point p)
{
try
{
var len = p?.Name.Length;
Console.WriteLine("no error " + len);
return len;
}
catch
{
Console.WriteLine("error");
return null;
}
}
}
class Point(int x, int y, string name)
{
public int X { get; } = x;
public int Y { get; } = y;
public string Name { get; } = name;
}
実行結果は以下の通り。
ちなみに、VS 2014 CTPを使ってみる他、Roslynのソースコードをgithubから最新版とってきてビルドすればVS 2013でも試せるはず。
null伝搬のショートサーキット
前にフォーラムをのぞいてみたところ、null伝搬演算子を左結合にするか右結合(ショートサーキット評価)にするか悩んでたはずですけども、上記の結果を見る限り、とりあえず現状では右結合(ショートサーキット評価)で実装されてるみたいですね。
右か左かっていうのは以下のような話。
左結合 | 右結合(ショートサーキットあり) | |
a?.b?.c の解釈順 | (a?.b)?.c | a?.(b?.c) |
a?.b?.c と同じ結果になるコード | var b = a == null ? null : a.b; var c = b == null ? null : b.c; return c; |
if (a == null) return null; var b = a.b; if (b == null) return null; var c = b.c; return c; |
a?.b.c で、aがnullだったら | (a?.b) の結果がnullなので、.c の時点でぬるぽ例外。 | a == null 判定の時点でもう .c を見ないので、例外は出ずに null が返る。 |
判定順をあえて変えたい時は | a?.(b?.c) という式がC#としては不自然で、1つの式では書けない | (a?.b)?.c |
採用の根拠 | 演算子はほとんどが左結合なので自然といえば自然。 | 条件演算子 ? : や null 結合演算子 ?? はショートサーキット評価なので、それと合わせるならこちらの方が自然。 |
C# 6.0 (試験実装)を使いたいなら
この機能、まだ正式にC# 6.0になったわけではないので、ビルド オプションで「C# 6.0」を選んでも使えません。というか、Visual StudioのUI上から設定できる場所はなくて、 .csproj を直接メモ帳とかで編集する必要があります。
C#チーム ブログで書かれてますが、<LangVersion>タグの中身を experimental に変えます。
本日のネタ画像
Swiftが識別子に絵文字を使えると聞いて。
https://twitter.com/ufcpp/status/473693778029461505
https://twitter.com/ufcpp/status/473696462648274945
C#でも識別子に絵文字が!
何がネタかというと、Roslynのソースコードいじって、自分で識別子に使える文字を増やした(char.IsLowSurrogateとかIsHightSurrogateとか判定してる部分がそう)。
やってることは単純で、Unicodeのサロゲートペアを識別子として認識するように || で条件式を増やしただけ。
なので、もちろん、このままだとたぶんいろいろとやばい文字を受け付けてしまうのではないかと。ちゃんとやろうと思ったら、ちゃんと文字の範囲チェックが必要なものの、そこまでコストかけたいかといわれると、実装コスト的にもコンパイル速度的にもちょっと。
Swiftはどうしてるんだろう。というか、何で絵文字を識別子にしようと思ったんだろう(なんとなく、サロゲートペアに対応してるよってことをアピールしたいだけな気もしつつ)。
コーディング面接
こないだのめとべや東京でライブコーディングなセッションしてきた。
ライブコーディング用の事前仕込み(最悪3分間クッキング方式コーディングに使うカンペ)資料はOneDriveにアップロード: http://1drv.ms/T1uCCd
スライドもOneDriveにも: http://1drv.ms/T1uFxM
最初の方のスライドで書いていますが、日本でもコーディング面接はやらないかなぁという願いを込めて。