<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.3" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>neue cc</title>
	<link>http://neue.cc</link>
	<description></description>
	<pubDate>Sun, 13 May 2012 14:17:42 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3</generator>
	<language>en</language>
			<item>
		<title>XboxInfoTwit - ver.2.4.0.3</title>
		<link>http://neue.cc/2012/05/13_373.html</link>
		<comments>http://neue.cc/2012/05/13_373.html#comments</comments>
		<pubDate>Sun, 13 May 2012 14:17:42 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[XboxInfoTwit]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/05/13_373.html</guid>
		<description><![CDATA[
neue cc - XboxInfoTwit


Xbox.comが内部的にちょっと変わっていて動かなくなっていたので、それに対応しました。前々から報告されている不具合などに関する修正などは一切入ってません、すみません。最近割と普通に忙しくて全く手をかけられな]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://neue.cc/software/xboxinfotwit" title="neue cc - XboxInfoTwit">neue cc - XboxInfoTwit</a></li>
</ul>

<p>Xbox.comが内部的にちょっと変わっていて動かなくなっていたので、それに対応しました。前々から報告されている不具合などに関する修正などは一切入ってません、すみません。最近割と普通に忙しくて全く手をかけられない状態でして……。落ち着いたらその時には必ず。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/05/13_373.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>MetroStyleDeveloper #03の告知</title>
		<link>http://neue.cc/2012/04/30_372.html</link>
		<comments>http://neue.cc/2012/04/30_372.html#comments</comments>
		<pubDate>Sun, 29 Apr 2012 15:53:59 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/04/30_372.html</guid>
		<description><![CDATA[最近は告知ばかりで、まともにブログ記事書いてなくてすみませんすみません。Windows Developer Daysでのセッションはお陰様で立ち見が出るほどに大盛況で、うれしかったです。資料に関しては、公開できるように調整中です（いちおー会社身分]]></description>
			<content:encoded><![CDATA[<p>最近は告知ばかりで、まともにブログ記事書いてなくてすみませんすみません。Windows Developer Daysでのセッションはお陰様で立ち見が出るほどに大盛況で、うれしかったです。資料に関しては、公開できるように調整中です（いちおー会社身分で出てるので、公開するときは会社サイトのほうになるかしら、と思っています）。中々面白い感じに仕上がっているので、なるべく早いうちに出したいところです。</p>

<p>さて、WDDのキーノートで <a href="http://gloops.com/news/2012/04/425microsoft-windows-developer-days-windows8.html">4月25日に開催されたMicrosoft Windows Developer Days にて、Windows8ベースで開発したグループスの試作アプリが発表されました</a> ということで、シアトルクエストという試作アプリが公開されました。その詳細を、5/12に開催される<a href="http://metrostyledev.net/index.php/event/20120512/">MetroStyleDeveloper #03</a>で発表します！（予定）。会場、弊社ですお。</p>

<p>というわけで、気になった方はそちらも是非是非来ていただけたらと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/04/30_372.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Windows Developer Daysで登壇します</title>
		<link>http://neue.cc/2012/04/17_371.html</link>
		<comments>http://neue.cc/2012/04/17_371.html#comments</comments>
		<pubDate>Mon, 16 Apr 2012 15:29:48 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/04/17_371.html</guid>
		<description><![CDATA[4/24-25に開催されるMicrosoft Windows Developer Daysで登壇します。セッション一覧より、Day 2の11:30-13:00、Room Fでタイトルは「LINQ to Everything : データソース・言語を超える LINQ の未来」です。

これなのですが、私の勤め先のgloopsがWDDのプラチナスポンサーで、そのスポンサー用のセッション枠を私が頂い]]></description>
			<content:encoded><![CDATA[<p>4/24-25に開催される<a href="http://www.microsoft.com/ja-jp/events/wdd/program.aspx">Microsoft Windows Developer Days</a>で登壇します。<a href="https://www.event-marketing.jp/events/wdd/Register/Session.aspx">セッション一覧</a>より、Day 2の11:30-13:00、Room Fでタイトルは「LINQ to Everything : データソース・言語を超える LINQ の未来」です。</p>

<p>これなのですが、私の勤め先の<a href="http://gloops.com/">gloops</a>がWDDのプラチナスポンサーで、そのスポンサー用のセッション枠を私が頂いた、みたいな形です。スポンサー枠なのに完全に趣味のLINQの話しかしない気満々とか非常にアレ。そんなわけなので是非来てください。ランチセッションなのでお昼も出るので、ご飯食べながらゆるゆると聞いてもらえればと思ってます。</p>

<p>弊社からは、他にSQL Azure MVPの大和屋さんが<a href="http://sqlazure.jp/b/sqlazure/1079/">gloops提供人気ソーシャルゲームでトラフィック限界に挑戦！SQL Azure Federation検証結果公開</a>というタイトルで4/24に出ますので、そちらも是非是非どうぞ。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/04/17_371.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Microsoft MVP for Visual C#を再受賞しました</title>
		<link>http://neue.cc/2012/04/02_370.html</link>
		<comments>http://neue.cc/2012/04/02_370.html#comments</comments>
		<pubDate>Sun, 01 Apr 2012 18:07:04 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/04/02_370.html</guid>
		<description><![CDATA[去年の報告から一年、再受賞することができました。活動はあまり変わらずC#とLINQについてブログに書いて、小さめのライブラリを作って公開して、それと今回は少し、外での活動が増えましたね。つい一昨日もSilverlightを囲む会でReactive Extensions v2.0として]]></description>
			<content:encoded><![CDATA[<p><a href="http://neue.cc/2011/04/02_313.html">去年の報告</a>から一年、再受賞することができました。活動はあまり変わらずC#とLINQについてブログに書いて、小さめのライブラリを作って公開して、それと今回は少し、外での活動が増えましたね。つい一昨日もSilverlightを囲む会で<a href="http://www.slideshare.net/neuecc/reactive-extensions-v20">Reactive Extensions v2.0</a>としてお話しました。</p>

<p>日本の海外に比べて弱いところ、先端的な技術の紹介であったりディープに踏み込んだ使い方であったり、何かを作って公開することであったり。それらを埋めていきたいな、と思っています。そういったことを通してC#の良さを伝えられていければ何よりです。</p>

<h2>近況</h2>

<p>さて、しかし色々何かと停滞中です……。ライブラリは更新していない、ツールもバグ報告スルー中、Pull Requestすら放置、原稿……、などなどなどなど。はい、どうみてもダメ人間です。やりたいこと、はいっぱいあって、やらなければならないこと、もそれなりにあって、それらがかちあってどっちも出来ず仕舞いで時間を浪費してばかり。今年はその辺もしっかり整理して、より多くの何かを届けていきたいところです。実際のとこダラダラTwitterやってる時間が一番長くてマズいのは確定的に明らか。Twitterやってる時間をSkyrimに回したほうがよっぽど有意義ってものですよ！しかもなんと超絶楽しみにしていたSkyrimは未だ未開封という、もうアレ。悲しいですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/04/02_370.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>ソーシャルゲームとわたくし</title>
		<link>http://neue.cc/2012/03/28_369.html</link>
		<comments>http://neue.cc/2012/03/28_369.html#comments</comments>
		<pubDate>Tue, 27 Mar 2012 17:23:23 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/03/28_369.html</guid>
		<description><![CDATA[最近のWeb業界の風潮にならって、ちゃんとロクロ回しました！


gloopsがWindows環境でソーシャルゲームをつくる理由｜【Tech総研】


猫も杓子もみんなソーシャルゲーム業界に行くんだなあ、とかﾎﾟｹｰｯと眺めていましたが、まさ]]></description>
			<content:encoded><![CDATA[<p>最近のWeb業界の風潮にならって、ちゃんとロクロ回しました！</p>

<ul>
<li><a href="http://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=002099">gloopsがWindows環境でソーシャルゲームをつくる理由｜【Tech総研】</a></li>
</ul>

<p>猫も杓子もみんなソーシャルゲーム業界に行くんだなあ、とかﾎﾟｹｰｯと眺めていましたが、まさか私も行くとは全然思ってもいませんでした。というわけで、1月から転職したと書きましたけれど、<a href="http://gloops.com/">株式会社gloops</a>で働いています。転職理由とかは、インタビューの通りです。C#を世間（といっても、技術系の人に、ですね）に強くアピールするにはどうすればいいのか、といったら、一番大事なのはそれで書かれたメジャーなアプリケーションなのです。PerlではてなやMixi、livedoorなどを思い浮かべる、RubyでCookpadを、ScalaでFoursquareやTwitterを、そういった憧れにも似た気持ちを浮かべさせるようなアプリケーションがなければいけなくて。</p>

<p><a href="http://stackoverflow.com/">Stack Overflow</a>はC#, ASP.NET MVCだし、<a href="http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html">TIOBEのプログラミング言語ランキング</a>では三位など、海外でのC#の地位は十分に高い。のですが、国内ではそれと比べれば全くもってない。日本で誰もが知る会社の誰もが知るアプリケーション、それがC#で書かれている。そういう状態にならなければ、日本で強く普及は無理だな、と。</p>

<p>ギョーム系アプリでは十分に強いじゃん、とかそうじゃなくて、私としてはもっと学生とかも憧れてガンガン使う感じであって欲しいんですよ。Visual Studioは無料版ありますし、学生向けの支援(<a href="http://msdn.microsoft.com/ja-jp/academic/hh455217">DreamSpark</a>など)もやってはいますが、あまりリーチできてないのではないかなあ、って。そういうのって内からやりたいって気持ちが湧いてきて初めて支援があって嬉しい！になるわけで。</p>

<p>まあその領域だったら、やっぱゲームですよゲーム！なんというか、Unityブームのほうがずっと請求してるかもなのですかねー。というわけで<a href="http://atnd.org/events/26442">第77回codeseek勉強会＆第17回日本C#ユーザー会 勉強会 : C#とゲーム</a>では、C#とゲーム全般を取り扱って、そのなかで弊社CTOの池田もソーシャルゲーム枠でセッション持ちますので、残席まだありますので是非是非どうぞ（宣伝）</p>

<p>ゲームもいいのですが、デスクトップアプリケーションもいいし（最近はあんまし流行らないですって？そうかもですがー）、モバイルアプリもいいし（Windows Phone 7よりも、MonoTouchやMono for Androidのほうが受けますな）、そして、ウェブアプリもいい。C#の持つ強みや範囲というのは、本当に、もっともっと知られて欲しいなって。</p>

<p>そんなようなことは入社初日にも言ったりなどしていて、今も当然変わってませんし、3ヶ月働いてきて、実現できる会社であると実感しています。<a href="http://event.yomiuri.co.jp/mlb/">2012 グループス MLB開幕戦</a>の冠協賛や、最近はCMも増えてきたりなど、露出も増えてきて、勢いありますね。その勢いを止めない、加速させるためにも、まだまだ人が必要というわけで、求人バナーもかなり見かけてるんじゃないかと思います。というわけで弊社ではエンジニアを絶賛募集中なのでC#で書きたい！という人は是非是非お願いします（宣伝）</p>

<p>あと、私自身の目的としてはもう一つあって、日本ローカルだけじゃなく世界にも通用する技術力を掲示したいという欲求があります。その面でも、世界に向けても前進している(<a href="http://game.watch.impress.co.jp/docs/interview/20120323_520639.html">gloops International CEO冨田由紀治氏インタビュー - GAME Watch</a>)のは、マッチしていました。とはいえ、まずは日本、です。そもそも全然半人前だと痛感する毎日で寝言は寝てから言え状態なので、日々鍛錬ですね。</p>

<h2>ソーシャルゲーム</h2>

<p>このサイトの前身はゲーム攻略サイト(Xbox系)で、2002年からです（このサイトのアレゲな配色はその頃から全く変わってないから、というのが大きな理由です）。また、特に好きな<a href="http://www.nicovideo.jp/watch/sm221184">Geometry Wars</a>なんて世界ランキングでもかなり上位だったりニコ動にプレイ動画を投稿したりする程度には、一応そこそこハードなゲーマーを自称していたのですが、最近はめっきりゲームとは遠ざかってしまいました。あうあう。完全にプログラミング系サイトですしねー。</p>

<p>というわけで、元ゲーマーとでもしませうか。で、ソーシャルゲーム。ゲーマーといったらソーシャルゲームは割と忌み嫌うという感じの！ふむ。まあでも、ほら、最近はアイドルマスター シンデレラガールズが（色々な意味で）話題だったり、それはそれで独特に面白さってのはあるんですね。いや、モゲマス面白いですよ、ガチャ地獄とか除いても普通に。必ず人と繋がり合う（それが衣装泥棒であっても）、それも緩やかに非同期に（MMORPGや対戦系は同期的ですから）というのは、独特なものがあると思います。</p>

<p>正直いって、まだ完全に面白さには繋がってないとは思いますが（特にゲーマー向けには）、このシンプルで非常に限られた中からゲーム性（と○○）を引き出すチャンスは転がっている、かもしれません。ずっとガラケー向けに貧相な画面とボタン連打だけで変わらない、わけでは、ない。スマートフォンの時代は来ているし、HTML5の流れだってあるし、それはソーシャルゲームだって同じなのです。</p>

<p>フロントエンドはモバイル向けというのを考慮しながらもリッチしなければならないし、バックエンドはハイパフォーマンスに耐えなければならない。課題は大量にありますが、だからこそ技術者としては挑戦しがいのある面白いテーマが山のように転がっています。例えばC# 5.0が非同期でハイパフォーマンスといったって、別にそんなのそこまで必要じゃないしなー、で終わってしまう状況もいっぱいあると思うのです。でも、弊社では、今すぐにでも必要なのだというぐらいに切羽詰ってる。C#の能力をフルに使いきることが求められる。これは楽しいですね？はい、楽しいです。</p>

<h2>会社員ですからー</h2>

<p>インタビュー記事が求人記事なので、会社員として宣伝しました！なので基本的にイイ事しか言いませんが、勿論イクナイ面もそれなりにあります。例えば最近の私の記事を見ると某テクノロジーをやたらDisってますが、なんでなんでしょうかねー、ふふり。とはいえ、不満に思うなら自分でぶち壊して再構築すればいいし、それが許される（勿論ちゃんと能力を証明したうえで）環境だとは思います。スキルある人が何の制約もなく存分に腕をふるえるのなら、素敵な話ではないでしょうか。</p>

<p>ちなみに私のスキルはC#/LINQに偏っていてウェブとかASP.NETの知識は並なので、毎日勉強です、人はそれを付け焼刃とも言う。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/03/28_369.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Visual Studio 11の非同期(&#8221;C#, ASP.NET, Web Forms, MVC&#8221;)</title>
		<link>http://neue.cc/2012/03/18_368.html</link>
		<comments>http://neue.cc/2012/03/18_368.html#comments</comments>
		<pubDate>Sun, 18 Mar 2012 07:48:42 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/03/18_368.html</guid>
		<description><![CDATA[世の中ひどぅーきひどぅーきと騒ぐばかりで、猫も杓子もNode.js。でもですね、【デブサミ2012】16-A-5 レポート　ソーシャルアプリケーションにおけるNode.jsの活かし方（1/2）：CodeZineなんかを見ても、そこで独自に作りこんでる例外処理だの非同期フロー]]></description>
			<content:encoded><![CDATA[<p>世の中ひどぅーきひどぅーきと騒ぐばかりで、猫も杓子もNode.js。でもですね、<a href="http://codezine.jp/article/detail/6461">【デブサミ2012】16-A-5 レポート　ソーシャルアプリケーションにおけるNode.jsの活かし方（1/2）：CodeZine</a>なんかを見ても、そこで独自に作りこんでる例外処理だの非同期フロー管理だのは、そりゃあ必要ですよね、まずはそこから始めるのは当然ですよね、と思いつつC#は最初から備えているんですよね。むしろ色々とC#のほうが、とか思ったりするわけですが（勿論Node.jsのほうがGoodなものもありますが）、こんなところで嘆いていても始まらないのでC#流の非同期の活かし方を見ていきましょうか。</p>

<h2>HttpTaskAsyncHandler</h2>

<p>ASP.NETの非同期ハンドラはIHttpAsyncHandlerなわけですが、VS11ではそれをTask(つまりC# 5.0 async/await)で扱いやすくした基底クラス、<a href="http://msdn.microsoft.com/ja-jp/library/system.web.httptaskasynchandler(v=vs.110).aspx">HttpTaskAsyncHandler</a>が用意されています。例えばTwitterの検索を叩いて返すだけどのものは以下のようになります。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> TwitterSearchHandler <span style="color: #008000;">:</span> HttpTaskAsyncHandler
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">async</span> <span style="color: #0600FF;">override</span> Task ProcessRequestAsync<span style="color: #000000;">&#40;</span>HttpContext context<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> term <span style="color: #008000;">=</span> context.<span style="color: #0000FF;">Request</span>.<span style="color: #0000FF;">QueryString</span><span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;q&quot;</span><span style="color: #000000;">&#93;</span>;
        <span style="color: #FF0000;">var</span> json <span style="color: #008000;">=</span> <span style="color: #FF0000;">await</span> <span style="color: #008000;">new</span> HttpClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetStringAsync</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;http://search.twitter.com/search.json?q=&quot;</span> <span style="color: #008000;">+</span> term<span style="color: #000000;">&#41;</span>;
&nbsp;
        context.<span style="color: #0000FF;">Response</span>.<span style="color: #0000FF;">ContentType</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;application/json&quot;</span>;
        context.<span style="color: #0000FF;">Response</span>.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#40;</span>json<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>普通と違うのはasyncとawaitだけなので、特に混乱もなく同期→非同期に乗り換えられると思います。非常に簡単。</p>

<p><a href="http://msdn.microsoft.com/ja-jp/library/system.net.http.httpclient(v=vs.110).aspx">HttpClient</a>も.NET 4.5からの新顔で、WebClientの後継的な位置付けでしょうか。細かいコントロールも可能で、かつ、WebRequestよりも簡単で、非同期にもきっちりマッチしている。というかHttpClientには同期的なメソッドは用意されていません。これからの非同期世代に完全準拠した新しいクラスということですね。</p>

<p>そして、テスト用のサーバー立てるのも非常に簡単で。Visual Studioで新規で空のASP.NETサイトプロジェクトを作って、↑のハンドラ足して、Ctrl + F5すればIIS Expressが立ち上がって、もうそれだけでOKなわけですよ。超簡単なわけですよ、マジでマジで。</p>

<p>こないだ、<a href="http://atnd.org/events/24951">RIA アーキテクチャー研究会　第3回</a>でのセッションではそうして作ったHttpTaskAsyncHandlerで、 context.Response.StatusCode = 404 にしてエラーを返した状態を再現したりしながらデモしていました。</p>

<div style="width:595px" id="__ss_11947538"> <strong style="display:block;margin:12px 0 4px"><a href="http://www.slideshare.net/neuecc/asynchronous-rx-andtask" title="C#次世代非同期処理概観 - Task vs Reactive Extensions" target="_blank">C#次世代非同期処理概観 - Task vs Reactive Extensions</a></strong> <iframe src="http://www.slideshare.net/slideshow/embed_code/11947538?rel=0" width="595" height="497" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe> <div style="padding:5px 0 12px"> View more <a href="http://www.slideshare.net/" target="_blank">presentations</a> from <a href="http://www.slideshare.net/neuecc" target="_blank">neuecc</a> </div> </div>

<p>今回はTaskを中心にしましたが、Rxを中心にしたものを<a href="http://silverlightsquare.com/index.php/tokyo06.html">Silverlightを囲む会in東京#6</a>で3/31に話す予定なので、まだ募集中なので是非来て下さい。また、Rx v2.0に関しては<a href="http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspx">Reactive Extensions v2.0 Beta available now! - Reactive Extensions Team Blog - Site Home - MSDN Blogs</a>で超詳細に書かれていますね。私もちょいちょいと書きたいことは溜まってるのですが中々にぐぬぬぬ。</p>

<h2>非同期ページ</h2>

<p>今更Web Formsとか超どうでもいいって感じが世界全体に漂ってるし真面目に色々と腐ってると本気で思うしDataSetとWeb Formsは今となっては.NET三大汚点の筆頭かなとか思ったり思わなかったり適当に言ったり呪詛を吐いたり、もう色々アレなのですが、それでも現実とは戦わなければならないのです！</p>

<p>というわけでVS11のASP.NET Web Formsの非同期の強化でも見てみましょう。C# 5.0でasync/awaitが入るのでASP.NET MVCのほうは非同期コントローラーでﾋｬｯﾎｲなのですがWeb Formsも一応対応してきました、一応ね、一応。</p>


<div class="wp_syntax"><div class="code"><pre class="xml xml" style="font-family:Consolas,monospace;">// Web.config
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;appSettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;add</span> <span style="color: #000066;">key</span>=<span style="color: #ff0000;">&quot;aspnet:UseTaskFriendlySynchronizationContext&quot;</span> <span style="color: #000066;">value</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/appSettings<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="xml xml" style="font-family:Consolas,monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;</span>%@ Page <span style="color: #000066;">Language</span>=<span style="color: #ff0000;">&quot;C#&quot;</span> <span style="color: #000066;">AutoEventWireup</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">CodeBehind</span>=<span style="color: #ff0000;">&quot;~/WebForm1.aspx.cs&quot;</span> <span style="color: #000066;">Inherits</span>=<span style="color: #ff0000;">&quot;WebApplication8.WebForm1&quot;</span></span>
<span style="color: #009900;">　　　　<span style="color: #000066;">Async</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">ViewStateMode</span>=<span style="color: #ff0000;">&quot;Disabled&quot;</span> %<span style="color: #000000; font-weight: bold;">&gt;</span></span>
&nbsp;
<span style="color: #00bbdd;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/1999/xhtml&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>Async Test<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/title<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;form</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;form1&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:TextBox</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;WordTextBox&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:Button</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;SearchButton&quot;</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Text</span>=<span style="color: #ff0000;">&quot;Button&quot;</span> <span style="color: #000066;">OnClick</span>=<span style="color: #ff0000;">&quot;SearchButton_Click&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:Repeater</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">ID</span>=<span style="color: #ff0000;">&quot;TwitterStatuses&quot;</span> <span style="color: #000066;">ItemType</span>=<span style="color: #ff0000;">&quot;dynamic&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ItemTemplate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:Label</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Text</span>=<span style="color: #ff0000;">&quot;&lt;%#: Item.from_user %&gt;</span></span>&quot; /&gt;<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;br</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
                <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;asp:Label</span> <span style="color: #000066;">runat</span>=<span style="color: #ff0000;">&quot;server&quot;</span> <span style="color: #000066;">Text</span>=<span style="color: #ff0000;">&quot;&lt;%#: Item.text %&gt;</span></span>&quot; /&gt;
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ItemTemplate<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/asp:Repeater<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/form<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// namespace WebApplication8</span>
<span style="color: #0600FF;">public</span> partial <span style="color: #FF0000;">class</span> WebForm1 <span style="color: #008000;">:</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Web</span>.<span style="color: #0000FF;">UI</span></span>.<span style="color: #0000FF;">Page</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> SearchButton_Click<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> task <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> PageAsyncTask<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">async</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> word <span style="color: #008000;">=</span> WordTextBox.<span style="color: #0000FF;">Text</span>;
            <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> stream <span style="color: #008000;">=</span> <span style="color: #FF0000;">await</span> <span style="color: #008000;">new</span> HttpClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetStreamAsync</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;http://search.twitter.com/search.json?q=&quot;</span> <span style="color: #008000;">+</span> word<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #FF0000;">var</span> json <span style="color: #008000;">=</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Json</span>.<span style="color: #0000FF;">JsonObject</span>.<span style="color: #0000FF;">Load</span><span style="color: #000000;">&#40;</span>stream<span style="color: #000000;">&#41;</span>;
                TwitterStatuses.<span style="color: #0000FF;">DataSource</span> <span style="color: #008000;">=</span> json<span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;results&quot;</span><span style="color: #000000;">&#93;</span>;
            <span style="color: #000000;">&#125;</span>
            DataBind<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        RegisterAsyncTask<span style="color: #000000;">&#40;</span>task<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>非同期ページの利用には Async=&#8221;true&#8221; 属性をつける必要があります。.NET 4.0まではつけていない場合は、同期的に動作するようになっていたのですが、.NET 4.5からはエラーになるように挙動が変更されています。また、PageAsyncTaskを利用する場合はWeb.configにUseTaskFriendlySynchronizationContext = true する必要もあるっぽいです。</p>

<p>これ自体はテキストボックスに検索語を入れてボタンを押すとひどぅーきでTwitter検索して表示する、というだけのDoudemoii代物です。PageAsyncTaskが引数にTaskを受け入れるようになったので、そこでasyncなラムダ式を突っ込んでやればいい、というわけで、まあまあ簡単と言えなくもなく仕上がっています。理想的には/直感的にはasync void SearchButton_Clickと書けるようになるべきなのですが、そうはいかないようです、残念。</p>

<p>JSONは.NET 4.5からお目見えの<a href="http://msdn.microsoft.com/ja-jp/library/system.json(v=vs.110).aspx">System.Json</a>を使いました。これ、AsDynamic()とするとdynamicで扱えるのでサクサクッと使えて便利です。また、そのdynamicとして使える性質を活かして、dynamicのままバインドしてみました(AsDynamicはコード上dynamicにキャストするというだけで、JsonValueはそのもの自身がdynamic = IDynamicMetaObjectProviderなのです)。System.Jsonは<a href="http://nuget.org/packages/System.Json">NuGet - System.Json</a>にもあるので、.NET 4ではそれを使えばいいでしょう。<a href="http://dynamicjson.codeplex.com/">DynamicJson</a>はお払い箱で。</p>

<p>それとRepeaterのItemType=&#8221;dynamic&#8221;。これでItem.from_userといったように、dynamicに使えるようになっています。匿名型をバインドしたい時なんかも、同じようにItemType=&#8221;dynamic&#8221;にしてしまうといいかな、と思ったんですが、それは出来ませんでした。あともう一歩、気を利かせてくれても良かったですねえ。</p>

<p>まあ、VS11からは、念願のバインディング式の中でIntelliSenseが効くようになっていて、それはRepeaterのItemTypeも例外ではないので、ちゃんと型作ってあげるのも良いとは思います。あと%:でHtmlEncodeもしてくれますのも良いところ。</p>

<p>ViewStateMode=&#8221;Disabled&#8221;で無駄なViewStateは生成しないようにするのも大事。これは.NET 4.0からですね。EnableViewStateとは別物という紛らわしさが残っているのも、まあなんともかんとも。ところでPageのViewStateModeをDisableにしてしまうと、this.ViewState[]が使えなくなってしまうので、マスターページからの、asp:Contentにしかけたほうがいいかもです。</p>

<h2>EventHandlerTaskAsyncHelper</h2>

<p>ASP.NETの非同期関連はMSDNマガジンの<a href="http://msdn.microsoft.com/ja-jp/magazine/cc163463.aspx">WickedCode: ASP.NET の非同期プログラミングを使ったスケール変換可能なアプリケーション</a>にまとまっていますが、そこにあるとおり非同期ページの実現方法にはもうひとつ、AddOnPreRenderCompleteAsyncを使う方法があります。それにもTask用のやり方がありますので、見てみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> helper <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> EventHandlerTaskAsyncHelper<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">async</span> <span style="color: #000000;">&#40;</span>_, __<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">var</span> word <span style="color: #008000;">=</span> WordTextBox.<span style="color: #0000FF;">Text</span>;
    <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> stream <span style="color: #008000;">=</span> <span style="color: #FF0000;">await</span> <span style="color: #008000;">new</span> HttpClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetStreamAsync</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;http://search.twitter.com/search.json?q=&quot;</span> <span style="color: #008000;">+</span> word<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> json <span style="color: #008000;">=</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Json</span>.<span style="color: #0000FF;">JsonObject</span>.<span style="color: #0000FF;">Load</span><span style="color: #000000;">&#40;</span>stream<span style="color: #000000;">&#41;</span>;
        TwitterStatuses.<span style="color: #0000FF;">DataSource</span> <span style="color: #008000;">=</span> json<span style="color: #000000;">&#91;</span><span style="color: #666666;">&quot;results&quot;</span><span style="color: #000000;">&#93;</span>;
    <span style="color: #000000;">&#125;</span>
    DataBind<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
AddOnPreRenderCompleteAsync<span style="color: #000000;">&#40;</span>helper.<span style="color: #0000FF;">BeginEventHandler</span>, helper.<span style="color: #0000FF;">EndEventHandler</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>EventHandlerTaskAsyncHelperを作り、それのBeginとEndをAddOnPreRenderCompleteAsyncに渡してあげます。ちょっとPageAsyncTaskより面倒ですね。まあ、でも、どちらでもいいでしょう。大した違いはありません。二つやり方があるとどちらにすればいいのかと迷ってしまうのが良くないところなんですよねえ、しかもどちらも似たようなものだと……。</p>

<h2>非同期モジュール</h2>

<p>Moduleについても見てみましょう。感覚的にはAddOnPreRenderCompleteAsyncと一緒で、EventHandlerTaskAsyncHelperを作り、追加したいイベントにBeginとEndを渡します。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> MyModule <span style="color: #008000;">:</span> IHttpModule
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Init<span style="color: #000000;">&#40;</span>HttpApplication application<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> helper <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> EventHandlerTaskAsyncHelper<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">async</span> <span style="color: #000000;">&#40;</span>sender, e<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> app <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>HttpApplication<span style="color: #000000;">&#41;</span>sender;
            <span style="color: #FF0000;">var</span> path <span style="color: #008000;">=</span> app.<span style="color: #0000FF;">Server</span>.<span style="color: #0000FF;">MapPath</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;~/log.txt&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> fs <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> FileStream<span style="color: #000000;">&#40;</span>path, FileMode.<span style="color: #0000FF;">Append</span>, FileAccess.<span style="color: #0000FF;">Write</span>, FileShare.<span style="color: #0000FF;">Read</span>, <span style="color: #FF0000;">4096</span>, useAsync<span style="color: #008000;">:</span> <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> sw <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StreamWriter<span style="color: #000000;">&#40;</span>fs, Encoding.<span style="color: #0000FF;">UTF8</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #FF0000;">await</span> sw.<span style="color: #0000FF;">WriteLineAsync</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Request:&quot;</span> <span style="color: #008000;">+</span> DateTime.<span style="color: #0000FF;">Now</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        application.<span style="color: #0000FF;">AddOnBeginRequestAsync</span><span style="color: #000000;">&#40;</span>helper.<span style="color: #0000FF;">BeginEventHandler</span>, helper.<span style="color: #0000FF;">EndEventHandler</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Dispose<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>AddOnXxxAsyncは沢山あるので、追加したいイベントを選べばいいでしょう。また、非同期でファイルを扱いたい時は、useAsync: trueにするのが大事です。デフォルトはfalseになっているので、Begin-Endをしても非同期にならない（というかスレッドプールを使った挙動になってしまう）そうです（と、プログラミング.NET Frameworkに書いてあった）。</p>

<h2>非同期コントローラー</h2>

<p>一応ASP.NET MVCでも見てみましょうか。TwitterのPublicTimelineを表示するだけのものを（テキストボックスすら作るのが面倒になってきた）</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> PublicTimelineController <span style="color: #008000;">:</span> AsyncController
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">async</span> Task<span style="color: #008000;">&lt;</span>ActionResult<span style="color: #008000;">&gt;</span> Index<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> stream <span style="color: #008000;">=</span> <span style="color: #FF0000;">await</span> <span style="color: #008000;">new</span> HttpClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetStreamAsync</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;https://twitter.com/statuses/public_timeline.json&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> json <span style="color: #008000;">=</span> <span style="color: #000000;">System</span>.<span style="color: #0000FF;">Json</span>.<span style="color: #0000FF;">JsonObject</span>.<span style="color: #0000FF;">Load</span><span style="color: #000000;">&#40;</span>stream<span style="color: #000000;">&#41;</span>;
            <span style="color: #0600FF;">return</span> View<span style="color: #000000;">&#40;</span>json<span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="xml xml" style="font-family:Consolas,monospace;"><span style="color: #00bbdd;">&lt;!DOCTYPE html&gt;</span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;head<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/head<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    @foreach (var item in Model)
    {
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
            @item.user.screen_name
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;br</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
            @item.text
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/p<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    }
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/body<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/html<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>AsyncControllerの自然さと、きゃーRazor最高ー抱いてー。</p>

<h2>まとめ</h2>

<p>HttpTaskAsyncHandlerにせよEventHandlerTaskAsyncHelperにせよ、中身は割とシンプルにTaskでラップしただけなので、それを自前で用意すればTask自体は.NET 4.0に存在するので、async/awaitは使えませんがそれなりに簡単に書けるようにはなります。とりあえず私はWeb Forms用のものを仕事で使うために用意しました。コードは会社で書いたものなので上げられませんが！というほど大したものでもないので上げちゃってもいいんですが上げません！Web Formsにはとっととお亡くなりになってもらいたいので。延命措置禁止。</p>

<p>Web Formsだって悪くないものだ、全力で頑張ればほら、こんなに出来るじゃないか、ということは容易い、ことはまったくなく全力なわけですが、しかし可能ではあるんですね、モバイル対応だろうがハイパフォーマンスサイトだろうが。きっとたぶん。でもね、なんかもうIE6にも対応しつつHTML5サイトです、とかやるぐらいに不毛感漂ってるし、その労力は別のとこに向けたいですよね、っていうか別のとこに向けばどれだけ幸せになれるだろうか、と思ってしまうのです。</p>

<p>考えてみると、こうもうぇぶけーな話を書くのも初めてな気がする。近頃はお仕事がそっち方面なので、出せる範囲でちょいちょい出してこうかと思います。とにかく結論としてはWeb Formsちゃんは、もう沢山頑張ったと思うのでそろそろ逝ってもらって構いません。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/03/18_368.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>LINQのWhereやSelect連打のパフォーマンス最適化について</title>
		<link>http://neue.cc/2012/03/08_367.html</link>
		<comments>http://neue.cc/2012/03/08_367.html#comments</comments>
		<pubDate>Wed, 07 Mar 2012 17:44:56 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/03/08_367.html</guid>
		<description><![CDATA[Where連打していますか？それともパフォーマンスの悪化を心配して&#38;&#38;連結にしていますか？LINQの仕組み＆遅延評価の正しい基礎知識 － ＠ITではWhere+Selectに対して


  「WhereSelectEnumerableIterator」となっていて、名前のとおり、WhereとSelectが統合されていることです。これは、「Where]]></description>
			<content:encoded><![CDATA[<p>Where連打していますか？それともパフォーマンスの悪化を心配して&amp;&amp;連結にしていますか？<a href="http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_06/greatblogentry_06_01.html">LINQの仕組み＆遅延評価の正しい基礎知識 － ＠IT</a>ではWhere+Selectに対して</p>

<blockquote>
  <p>「WhereSelectEnumerableIterator」となっていて、名前のとおり、WhereとSelectが統合されていることです。これは、「Where」->「Select」が頻出パターンなので、それらを統合することでパフォーマンスを向上させるためでしょう。</p>
</blockquote>

<p>と書きましたが、では連打の場合はどうなっているでしょうか。見てみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> seq1 <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">3</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>;</pre></div></div>


<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqwherewhere.jpg">
</p>

<p>// どうでもいいんですが、これは<a href="http://www.microsoft.com/visualstudio/11/ja-jp">Visual Studio 11 Beta</a>です。VS11最高ですよ！</p>

<p>@ITの記事では、sourceに格納されて内包した形の連鎖となっている、と書きました。しかしseq1のsourceはRangeIteratorで、Where連打のはずなのに、すぐ上の階層が元ソースとなっています。そして、predicateの名前がCombinePredicates。はい、その通りで、2つの条件式が連結されています。確認してみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> pred <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, <span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#41;</span>seq1.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetField</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;predicate&quot;</span>, BindingFlags.<span style="color: #0000FF;">NonPublic</span> | BindingFlags.<span style="color: #0000FF;">Instance</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetValue</span><span style="color: #000000;">&#40;</span>seq1<span style="color: #000000;">&#41;</span>;
&nbsp;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pred<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// false</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pred<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">3</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// false</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pred<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// true</span></pre></div></div>


<p>というわけで、Where連打はpredicateが連結されて一つのWhereに最適化されることが確認できました。<a href="http://neue.cc/2009/07/21_178.html">LinqとCountの効率</a>でICollectionやIListの場合の特別扱いなケースがあることを紹介しましたが、Whereに関しても同様な特別扱いが発生するというわけです。</p>

<h2>Selectの場合</h2>

<p>Whereの他にSelectの場合も、同じような最適化を行ってくれます。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> seq2 <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">+</span> <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> selector <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, <span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#41;</span>seq2.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetField</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;selector&quot;</span>, BindingFlags.<span style="color: #0000FF;">NonPublic</span> | BindingFlags.<span style="color: #0000FF;">Instance</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetValue</span><span style="color: #000000;">&#40;</span>seq2<span style="color: #000000;">&#41;</span>;
&nbsp;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>selector<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 2 * 2 + 10 = 14</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>selector<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 5 * 2 + 10 = 20</span></pre></div></div>


<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqselectselect.jpg">
</p>

<p>sourceのすぐ上がRangeIteratorで、selectorにCombineSelectorsとして格納されていました。なお、型名であるWhereSelectEnumerableIteratorのとおり、現在はpredicateはnullですが、前段にWhereを書けばpredicateに格納されて、やはりWhere+Selectの最適化となります。では、後段にWhereを書いた場合は……？</p>

<h2>最適化されない場合</h2>

<p>Where+SelectとSelect+Whereは異なるものです。見てみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> whereSelect <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> selectWhere <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>;</pre></div></div>


<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqwhereselectselectwhere.jpg">
</p>

<p>Where+SelectはWhereSelectEnumerableIteratorのpredicateとselectorにそれぞれデリゲートが格納され、ひとまとめに最適化されていますが、Select+WhereはsourceがRangeIteratorではなくWhereSelectEnumerableIteratorであるように、普通に階層の内包構造となっています。Selectの後にWhereは最適化されません。まあ、そりゃ値が変形されているのだからpredicateがひとまとまりになるわけがなく、当たり前ではあります。</p>

<p>次にインデックスが使えるオーバーロードのケースを見てみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> whereIndex <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>x, i<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> i <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> selectIndex <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>x, i<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> i <span style="color: #008000;">*</span> <span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// GetEnumeratorしないとpredicate/selectorとsourceがnullです</span>
<span style="color: #008080; font-style: italic;">// これはyield returnによる生成なためです</span>
whereIndex.<span style="color: #0000FF;">GetEnumerator</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
selectIndex.<span style="color: #0000FF;">GetEnumerator</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqehereindexselectindex.jpg">
</p>

<p>これもひとまとめにしようにも、しようがないので、当然といえば当然ですね。</p>

<h2>IQueryableの場合</h2>

<p>IQueryableだとどうなのか、というと……</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// LINQ to SQL - AdventureWorks sample</span>
<span style="color: #FF0000;">var</span> ctx <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> AdventureWorksDataContext<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">var</span> query <span style="color: #008000;">=</span> from model <span style="color: #0600FF;">in</span> ctx.<span style="color: #0000FF;">ProductModel</span>
            where model.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">==</span> <span style="color: #666666;">&quot;hoge&quot;</span>
            where model.<span style="color: #0000FF;">ProductModelID</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">100</span>
            select model.<span style="color: #0000FF;">Instructions</span>;
&nbsp;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>query<span style="color: #000000;">&#41;</span>;</pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:Consolas,monospace;">// 結果
SELECT [t0].[Instructions]
FROM [Production].[ProductModel] AS [t0]
WHERE ([t0].[ProductModelID] = @p0) AND ([t0].[Name] = @p1)</pre></div></div>


<p>というわけで、LINQ to SQLはand連結されますね。ここで注意なのが、どういう挙動を取るのかは全てクエリプロバイダの解釈次第です。例えば<a href="http://linqtotwitter.codeplex.com/">LINQ to Twitter</a>はwhere連打ではダメで、&amp;&amp;で連結しなければなりません。</p>

<h2>Reactive Extensionsの場合</h2>

<p><a href="http://msdn.microsoft.com/en-us/data/gg577609">Reactive Extensions</a>の場合も見てみましょうか。Rx-Main(1.0.11226)では、というと</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> rx <span style="color: #008000;">=</span> Observable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">3</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>;</pre></div></div>


<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqrxstable.jpg">
</p>

<p>さっぱりワケワカメですが、とりあえずひとまとめになってないのでは感でしょうか。それにしても本当にワケワカメ。次にRx_Experimental-Main(1.1.11111)は、というと</p>

<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqrxexperimental.jpg">
</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> pred <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, <span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#41;</span>rx.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetField</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;_predicate&quot;</span>, BindingFlags.<span style="color: #0000FF;">NonPublic</span> | BindingFlags.<span style="color: #0000FF;">Instance</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetValue</span><span style="color: #000000;">&#40;</span>rx<span style="color: #000000;">&#41;</span>;
&nbsp;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pred<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// false</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pred<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">3</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// false</span>
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>pred<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">6</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// true</span></pre></div></div>


<p>_predicate発見！Experimental版では挙動が改善され、ひとまとめにされているようです。IDisposable&lt;Generate>は、Rangeの生成がGenerateメソッドによってなされているからですね。しかし、やはり読み取りにくい。</p>

<h2>Rx v2</h2>

<p>3/5に<a href="http://www.microsoft.com/download/en/details.aspx?id=29058">Reactive Extensions (Rx) v2.0 Beta</a>の配布がスタートしています。NuGetでは<a href="http://nuget.org/packages/Rx-Main">Install-Package Rx-Main -Pre</a>で配布されていますね。改善内容は後日詳しくということでまだ詳しくは出てないのですが、v2というだけあって中身はガラッと変わっています。とりあえず、見てみましょう。</p>

<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/linqrxv2.jpg">
</p>

<p>もちろん、predicateはひとまとめにされているのですが、それだけじゃなくて、とにかく見やすい、分かりやすい。しかし、ところどころ変ですね、Observαble(aがアルファ)だのΩだの。v2はソースのキチガイ度が跳ね上がっているのでILSpyとかで覗いちゃえる人は一度見ちゃうといいと思います、頭おかしい。あと、C#でのプログラミング的な小技も効いてたりして、テクニックの学習にもとても良い。</p>

<h2>スタックトレースへの影響</h2>

<p>このコードのクリアさはスタックトレースにも良い影響を与えています。まず、Rx v1で見てみると</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">try</span>
<span style="color: #000000;">&#123;</span>
    Observable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">%</span> <span style="color: #FF0000;">2</span> <span style="color: #008000;">==</span> 0<span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Take</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Timestamp</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>_ <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
<span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>Exception ex<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>ex.<span style="color: #0000FF;">StackTrace</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:Consolas,monospace;">場所 ConsoleApplication9.Program.&lt;Main&gt;b__1(Timestamped`1 _) 場所 c:\Users\ne
場所 System.Reactive.AnonymousObserver`1.Next(T value)
場所 System.Reactive.AbstractObserver`1.OnNext(T value)
場所 System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
場所 System.Reactive.AbstractObserver`1.OnNext(T value)
場所 System.Reactive.Linq.Observable.&lt;&gt;c__DisplayClass408`2.&lt;&gt;c__DisplayClass40a.&lt;Select&gt;b__407(TSource x)
場所 System.Reactive.AnonymousObserver`1.Next(T value)
場所 System.Reactive.AbstractObserver`1.OnNext(T value)
場所 System.Reactive.AnonymousObservable`1.AutoDetachObserver.Next(T value)
場所 System.Reactive.AbstractObserver`1.OnNext(T value)
場所 System.Reactive.Linq.Observable.&lt;&gt;c__DisplayClass43e`1.&lt;&gt;c__DisplayClass440.&lt;Take_&gt;b__43d(TSource x)
// 以下略</pre></div></div>


<p>これは酷い。こんなの見ても何一つ分かりはしません。では、Rx v2で試してみると</p>


<div class="wp_syntax"><div class="code"><pre class="txt" style="font-family:Consolas,monospace;">場所 ConsoleApplication10.Program.&lt;Main&gt;b__1(Timestamped`1 _) 場所 c:\Users\n
場所 System.Reactive.AnonymousObserver`1.Next(T value)
場所 System.Reactive.ObserverBase`1.OnNext(T value)
場所 System.Reactive.Linq.Observαble.Timestamp`1._.OnNext(TSource value)
場所 System.Reactive.Linq.Observαble.Take`1._.OnNext(TSource value)
場所 System.Reactive.Linq.Observαble.Where`1._.OnNext(TSource value)
場所 System.Reactive.Linq.Observαble.Range._.LoopRec(Int32 i, Action`1 recurse)
場所 System.Reactive.Concurrency.Scheduler.&lt;&gt;c__DisplayClass3a`1.&lt;InvokeRec1&gt;b__37(TState state1)
// 以下略</pre></div></div>


<p>めっちゃよく分かる。Timestamp->Take->Where->Rangeという遡りがしっかり見える。何て素晴らしいんだ！</p>

<h2>匿名 vs 有名</h2>

<p>さて、どういうことかというと、これ、<a href="http://neue.cc/2010/07/05_265.html">neue cc - Rx(Reactive Extensions)を自前簡易再実装する</a>で紹介したような、ラムダ式をぶん投げてその場で匿名のクラスを作るAnonymousパターンをやめたんですね。で、代わりに名前付きのクラスを立ててる。だから分かりやすい。</p>

<p>これ、uupaaさんが仰ってる<a href="http://blog.7kai.org/2011/03/markdown-binder-js-navi/">ナビ子記法</a>←ググッた先の本人のスライドが、Handsoutがサービス終了で見れないので、紹介のある記事にリンクします-などにも近いところがあるかなあ、と。</p>

<p>ただやっぱ書くのにはコスト高というか匿名で書けることの良さを殺してしまうので、ライブラリサイドだったら検討する、アプリケーションサイドだったらやらない、になってしまうかなあ。ライブラリサイドであってもかなり手間なので、よほど余裕あるとかでないとやらない、かなあ。JavaScriptならともかくC#では、特に……。</p>

<h2>Rx v2についてもう少し</h2>

<p>詳しい話は詳細が出てから、と思いますが（と言いながらRxJSの話も結局書いてないので、あうあう）、とりあえずObservableへの拡張メソッド郡はExperimentalから変化は特にありません。ただ、Experimentalは既にStableとはかなり違っているので、Stableしか追っかけてない人は、かなり目新しいものを見かけることができると思います。</p>

<p>内部実装は見たとおりガラッと変わって、スタックトレースも見やすくなった、などなどなわけですが、それとあわせてパフォーマンスも相当上がっています。v1で基本的な部分を固めたので、v2ではそういった周辺部分に本気で取り組みだした、ということですね。</p>

<h2>まとめ</h2>

<p>LINQは細かいところまで配慮が行き届いていて本当に素晴らしいですね。というわけで平然とWhereの連打かましましょう。私もつい昨日にWhere6連打かましたりしてました。</p>

<p><a href="http://linqjs.codeplex.com/">linq.js - LINQ for JavaScript</a>はさすがにここまではやってないんですが、いずれかはやりたいですね。その前にやらなきゃならないことがありすぎて当面はないですけれど。うーん、なんかもう色々やることありすぎて、かつそれなりに忙しくて、頭が爆発しそうです。はっきしいってヤバい。で、こうしてヤバくなると、硬直しちゃって余計に何もできなくなったり、唐突にこうして息抜き記事を書き出したり、うみみぅ。まあともかく、がんばろふ。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/03/08_367.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>とあるRoslynではないC# Parser、NRefactoryの紹介</title>
		<link>http://neue.cc/2012/02/23_366.html</link>
		<comments>http://neue.cc/2012/02/23_366.html#comments</comments>
		<pubDate>Wed, 22 Feb 2012 16:26:23 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/02/23_366.html</guid>
		<description><![CDATA[ﾛｯｽﾞﾘｰﾝ、はっじまらないよ～。というわけでMicrosoft “Roslyn” CTP、Compiler as a Service。NuGet - Roslynでも手に入るので、サンプル類やC# Interactiveとかはなしで、とりあえずScriptingやCompilerを触ってみたい、ということなら、お手軽です。しかし、まあ未実装も少なくなく、まだまだ先は長]]></description>
			<content:encoded><![CDATA[<p>ﾛｯｽﾞﾘｰﾝ、はっじまらないよ～。というわけで<a href="http://msdn.microsoft.com/ja-jp/roslyn">Microsoft “Roslyn” CTP</a>、Compiler as a Service。<a href="http://nuget.org/packages/Roslyn">NuGet - Roslyn</a>でも手に入るので、サンプル類やC# Interactiveとかはなしで、とりあえずScriptingやCompilerを触ってみたい、ということなら、お手軽です。しかし、まあ未実装も少なくなく、まだまだ先は長そうな雰囲気ではある。今すぐ欲しいのに！切実にC# Parserが！というわけで、今日はその良き代替となる（かもしれない）<a href="https://github.com/icsharpcode/NRefactory">NRefactory</a>を紹介します。</p>

<p>NRefactoryは<a href="https://packages.nuget.org/packages/ICSharpCode.NRefactory/">NuGet - NRefactory</a>からも入ります。verは5.0.0.4、「This is an alpha release. Expect bugs and breaking changes in the future.」とのことで、こちらもまだまだこれからのよう(MonoDevelopの新しいC#エディタで使われる予定、だそうです)。とりあえずNuGetで参照してみませう。</p>

<p>参照するとMono.Cecilが入ったり名前空間にMono.CSharpがあったりと、全体的に<a href="http://www.mono-project.com/CSharp_Compiler">MonoのCSharp Compiler</a>やその周辺が使われているふいんき。Mono.CSharpは単体でもついこないだ<a href="https://nuget.org/packages/Mono.CSharp">NuGet - Mono.CSharp</a>で入れられるようになりましたが、そのまんまだと、なんというかどう使っていいか分からないというか、はいEvalできた、さて、はて？みたいになってしまって。そのへん、NRefactoryはゆるふわで、結構すぐに使い方分かります。とりあえず使ってみませう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.IO</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Linq</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">ICSharpCode.NRefactory.CSharp</span>;
&nbsp;
<span style="color: #FF0000;">class</span> Program
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> code <span style="color: #008000;">=</span> File.<span style="color: #0000FF;">ReadAllText</span><span style="color: #000000;">&#40;</span><span style="">@&quot;../../Program.cs&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> parser <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CSharpParser<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #FF0000;">var</span> root <span style="color: #008000;">=</span> parser.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>code, <span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #FF0000;">var</span> program <span style="color: #008000;">=</span> root.<span style="color: #0000FF;">Descendants</span>.<span style="color: #0000FF;">OfType</span><span style="color: #008000;">&lt;</span>ICSharpCode.<span style="color: #0000FF;">NRefactory</span>.<span style="color: #0000FF;">CSharp</span>.<span style="color: #0000FF;">TypeDeclaration</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">First</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        program.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Hogegram&quot;</span>;
&nbsp;
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>root.<span style="color: #0000FF;">ToSourceString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> CompilationUnitExtensions
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">readonly</span> CSharpFormattingOptions DefaultOptions <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CSharpFormattingOptions<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">// TODO:130のboolを自分の気にいるようなOption（というかVSのデフォ）に近づける</span>
    <span style="color: #000000;">&#125;</span>;
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">string</span> ToSourceString<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> CompilationUnit compilationUnit, <span style="color: #FF0000;">int</span> indentation <span style="color: #008000;">=</span> <span style="color: #FF0000;">4</span>, <span style="color: #FF0000;">string</span> indentationString <span style="color: #008000;">=</span> <span style="color: #666666;">&quot; &quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> ToSourceString<span style="color: #000000;">&#40;</span>compilationUnit, DefaultOptions, indentation, indentationString<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">string</span> ToSourceString<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> CompilationUnit compilationUnit, CSharpFormattingOptions options, <span style="color: #FF0000;">int</span> indentation <span style="color: #008000;">=</span> <span style="color: #FF0000;">4</span>, <span style="color: #FF0000;">string</span> indentationString <span style="color: #008000;">=</span> <span style="color: #666666;">&quot; &quot;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> sw <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringWriter<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> formatter <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TextWriterOutputFormatter<span style="color: #000000;">&#40;</span>sw<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                Indentation <span style="color: #008000;">=</span> indentation,
                IndentationString <span style="color: #008000;">=</span> indentationString
            <span style="color: #000000;">&#125;</span>;
&nbsp;
            <span style="color: #FF0000;">var</span> visitor <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CSharpOutputVisitor<span style="color: #000000;">&#40;</span>formatter, options<span style="color: #000000;">&#41;</span>;
            compilationUnit.<span style="color: #0000FF;">AcceptVisitor</span><span style="color: #000000;">&#40;</span>visitor<span style="color: #000000;">&#41;</span>;
            <span style="color: #0600FF;">return</span> sw.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>Program.csを読み込んで、クラス名をHogegramに変更したのを出力する、というだけのものです。今のところ整形した文字列化にはCSharpOutputVisitorを作って、AcceptVisitorしなきゃならないようで面倒ぃので、とりあえず拡張メソッドにしました。デフォルトの整形オプションが気に食わないのですが、フォーマット設定が超細かくて100個以上のboolをON/OFFしなきゃいけないのでとりあえず放置。</p>

<p>構文木の取得自体は超単純で、new CSharpParser()してParse。そしてツリーを辿るのはLINQ to Xmlと同じ感覚でDescendantsやAncestors、Childrenなどなどが用意されているので、一発で分かりますね！そしてOfTypeで自分の欲しいのにフィルタリング、と。この辺は超簡単。そして名前を変えたければ、プロパティに代入するだけ。非常に楽ちんです、素晴らしい……！</p>

<h2>vs Roslyn</h2>

<p>さて、じゃあRoslynでも同じことをやってみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.IO</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Linq</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">Roslyn.Compilers.CSharp</span>;
&nbsp;
<span style="color: #FF0000;">class</span> Program
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> code <span style="color: #008000;">=</span> File.<span style="color: #0000FF;">ReadAllText</span><span style="color: #000000;">&#40;</span><span style="">@&quot;../../Program.cs&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> tree <span style="color: #008000;">=</span> SyntaxTree.<span style="color: #0000FF;">ParseCompilationUnit</span><span style="color: #000000;">&#40;</span>code<span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #FF0000;">var</span> program <span style="color: #008000;">=</span> tree.<span style="color: #0000FF;">Root</span>.<span style="color: #0000FF;">DescendentNodes</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">OfType</span><span style="color: #008000;">&lt;</span>ClassDeclarationSyntax<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">First</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #FF0000;">var</span> newNode <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ClassNameRewriter<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Dictionary<span style="color: #008000;">&lt;</span>ClassDeclarationSyntax, <span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#123;</span> program, <span style="color: #666666;">&quot;Hogegram&quot;</span> <span style="color: #000000;">&#125;</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Visit</span><span style="color: #000000;">&#40;</span>tree.<span style="color: #0000FF;">Root</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>newNode.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ClassNameRewriter <span style="color: #008000;">:</span> SyntaxRewriter
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">readonly</span> IDictionary<span style="color: #008000;">&lt;</span>ClassDeclarationSyntax, <span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> replaceNames;
&nbsp;
    <span style="color: #0600FF;">public</span> ClassNameRewriter<span style="color: #000000;">&#40;</span>IDictionary<span style="color: #008000;">&lt;</span>ClassDeclarationSyntax, <span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> replaceNames<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">replaceNames</span> <span style="color: #008000;">=</span> replaceNames;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">override</span> SyntaxNode VisitClassDeclaration<span style="color: #000000;">&#40;</span>ClassDeclarationSyntax node<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> oldIdentifierToken <span style="color: #008000;">=</span> node.<span style="color: #0000FF;">Identifier</span>;
&nbsp;
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>replaceNames.<span style="color: #0000FF;">ContainsKey</span><span style="color: #000000;">&#40;</span>node<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> newNode <span style="color: #008000;">=</span> node.<span style="color: #0000FF;">Update</span><span style="color: #000000;">&#40;</span>node.<span style="color: #0000FF;">Attributes</span>,
               node.<span style="color: #0000FF;">Modifiers</span>, node.<span style="color: #0000FF;">Keyword</span>,
               Syntax.<span style="color: #0000FF;">Identifier</span><span style="color: #000000;">&#40;</span>
                   oldIdentifierToken.<span style="color: #0000FF;">LeadingTrivia</span>,
                   replaceNames<span style="color: #000000;">&#91;</span>node<span style="color: #000000;">&#93;</span>, <span style="color: #008080; font-style: italic;">// ここだけ！</span>
                   oldIdentifierToken.<span style="color: #0000FF;">TrailingTrivia</span><span style="color: #000000;">&#41;</span>,
               node.<span style="color: #0000FF;">TypeParameterListOpt</span>, node.<span style="color: #0000FF;">BaseListOpt</span>,
               node.<span style="color: #0000FF;">ConstraintClauses</span>, node.<span style="color: #0000FF;">OpenBraceToken</span>,
               node.<span style="color: #0000FF;">Members</span>, node.<span style="color: #0000FF;">CloseBraceToken</span>,
               node.<span style="color: #0000FF;">SemicolonTokenOpt</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #0600FF;">return</span> newNode;
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">else</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #0600FF;">base</span>.<span style="color: #0000FF;">VisitClassDeclaration</span><span style="color: #000000;">&#40;</span>node<span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>構文木の取得はこちらも簡単です、SyntaxTree.ParseCompilationUnitだけ。ツリーの辿り方も似ていて、DescendentNodes、ChildNodes、Ancestors、と、戸惑うことなく使える感じです。OfTypeでフィルタして絞り込みも同じ。書き換えたコードの出力は、こちらはToStringだけでOK、しかもフォーマットルールは何の設定もいらずVS標準と同じ状態になっているので楽ちん。</p>

<p>が、しかし、こちらはクラス名の書き換えが面倒。Expression Treeと同じく基本的にイミュータブルになっているので、書き換えはプロパティに代入するだけ、とはいかず、大掛かりな仕掛けが必要です。というかこの程度のためだけにVisitorとか……。一応ReplaceNodeとかUpdateとかもあるんですが、うーん、まあ、何というか、よくわかってないので深く突っ込まれると窮します:)</p>

<h2>まとめ</h2>

<p>提供する機能は同じでも、使い心地とかは、両者、結構違くなるのではという印象。どちらも発展途上なのですが、ライセンス的にRoslynは今は使えないのに比べると、NRefactoryはMITライセンスで、アルファ版なのを留意しておけば使えるのではというのが、私的には大きいかなあ。割と切迫してC# Parserが必要なところなので、ここはちょっとNRefactoryを使い込んでみたいなあ、なんて思っています。いや、そこまでDeepに使い倒すというより簡単なコード解析と置換程度なので、しっかり使ってバグ報告、とかの貢献は出来なさそうですんがー。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/02/23_366.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>ImplicitQueryString - 暗黙的変換を活用したC#用のクエリストリング変換ライブラリ</title>
		<link>http://neue.cc/2012/02/18_365.html</link>
		<comments>http://neue.cc/2012/02/18_365.html#comments</comments>
		<pubDate>Sat, 18 Feb 2012 10:47:34 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/02/18_365.html</guid>
		<description><![CDATA[
ImplicitQueryString - CodePlex


QueryStringかったるいですね、変換するのが。intに。boolに。それ以外に。そのままじゃどうしようもなくストレスフル。そこで、以下のように書けるライブラリを作りました。勿論NuGetでのインストールも可能です。あと、ライブラリと]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://implicitquerystring.codeplex.com/">ImplicitQueryString - CodePlex</a></li>
</ul>

<p>QueryStringかったるいですね、変換するのが。intに。boolに。それ以外に。そのままじゃどうしようもなくストレスフル。そこで、以下のように書けるライブラリを作りました。勿論<a href="http://nuget.org/packages/ImplicitQueryString">NuGet</a>でのインストールも可能です。あと、ライブラリといっても例によって.csファイル一個だけなので、導入は超お手軽。</p>

<p>以下はASP.NETの例ですが、NameValueCollectionを使っているものは全て対象になります。QueryStringだけじゃなくてRequest.Formなどにも使えますね。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// using Codeplex.Web;</span>
&nbsp;
<span style="color: #FF0000;">int</span> count;
<span style="color: #FF0000;">string</span> query;
<span style="color: #FF0000;">bool</span><span style="color: #008000;">?</span> isOrdered; <span style="color: #008080; font-style: italic;">// support nullable</span>
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> Page_Load<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    count <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValue</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;c&quot;</span><span style="color: #000000;">&#41;</span>;
    query <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValue</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;q&quot;</span><span style="color: #000000;">&#41;</span>;
    isOrdered <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValue</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;ord&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>NameValueCollectionへの拡張メソッドとして実装しているので、using Codeplex.Webを忘れないように。ポイントは「型の明示が不要」というところです。クエリストリングを解析したい時って、通常はフィールドで既に変数自体は作っているのではないかと思います。なら、代入時に左から型を推論させてしまえばいいわけです、モダンなC#はわざわざ明示的に型なんて書かない、書きたくない。なのでこのライブラリ、ImplicitQueryStringではParseValueだけで全ての基本型(int, long, bool, string, DateTimeなど)へと型指定不要で代入可能となっています。代入先の型がNullableである場合は、キーが見つからなかったりパースに失敗した場合はnullにすることもサポートしてます。</p>

<p>また、よくあるクエリストリングはUrlEncodeされているのでデコードしたかったりするケースにも簡単に対応しています、UrlDecodeを渡すだけ！他にもEnumへの変換も出来ますし、キーが見つからなかったり変換不可能だったりした場合は指定したデフォルト値を返すParseValueOrDefault/ParseEnumOrDefaultも用意してあります。キーがあるかチェックするContainsKeyも。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">enum</span> Sex
<span style="color: #000000;">&#123;</span>
    Unknown <span style="color: #008000;">=</span> 0, Male <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span>, Female <span style="color: #008000;">=</span> <span style="color: #FF0000;">2</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">enum</span> BloodType
<span style="color: #000000;">&#123;</span>
    Unknown, A, B, AB, O
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">int</span> age;
<span style="color: #FF0000;">string</span> name;
DateTime<span style="color: #008000;">?</span> requestTime;  <span style="color: #008080; font-style: italic;">// nullableやDateTimeもサポート</span>
<span style="color: #FF0000;">bool</span> hasChild;
Sex sex;               <span style="color: #008080; font-style: italic;">// enumもいけます</span>
BloodType bloodType;
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> Page_Load<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
     <span style="color: #008080; font-style: italic;">// こんなQueryStringがあるとして</span>
    <span style="color: #008080; font-style: italic;">// a=20&amp;n=John%3dJohn+Ab&amp;s=1&amp;bt=AB</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// ageは左から推論してintを返します</span>
    age <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValue</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;a&quot;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 20</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// UrlDecodeしたstringが欲しい時は第二引数にメソッドそのものを渡すだけ</span>
    name <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValue</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;n&quot;</span>, HttpUtility.<span style="color: #0000FF;">UrlDecode</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// John=John Ab</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// 代入先の型がnullableの場合は、もしキーが見つからなかったりパースに失敗したらnullにしてくれます</span>
    requestTime <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValue</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;t&quot;</span>, HttpUtility.<span style="color: #0000FF;">UrlDecode</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// null</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// キーが見つからなかったりパースに失敗したら指定した値を返してくれます</span>
    hasChild <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseValueOrDefault</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;cld&quot;</span>, <span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// false</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// Enumの変換は数字の場合でも文字列の場合でも、どちらでも変換可能です</span>
    sex <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseEnum</span><span style="color: #008000;">&lt;</span>Sex<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;s&quot;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// Sex.Male</span>
    bloodType <span style="color: #008000;">=</span> Request.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">ParseEnumOrDefault</span><span style="color: #008000;">&lt;</span>BloodType<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;bt&quot;</span>, BloodType.<span style="color: #0000FF;">Unknown</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// BloodType.AB</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// ContainsKeyはキーの有無をチェックします</span>
    <span style="color: #FF0000;">var</span> hasFlag <span style="color: #008000;">=</span> qs.<span style="color: #0000FF;">ContainsKey</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;flg&quot;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// false</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>これで、あらゆるケースでサクッと変換することが可能なのではかと思います。ちなみに、ParseValue/ParseEnumでキーが見つからなかった場合はKeyNotFoundExceptionを返します。ParseValueで失敗したらFormatException、ParseEnumで失敗したらArgumentExceptionです。この二つが分かれているのは、int.Parseとかに渡しているだけなので、そちらの都合です。</p>

<h2>仕組み</h2>

<p>ImplicitQueryStringという名前がネタバレなのですが、単純に暗黙的変換をしているだけです。左から推論とか、ただのハッタリです。<a href="http://neue.cc/2012/02/14_364.html">neue cc - dynamicとQueryString、或いは無限に不確定なオプション引数について</a>を書いたときに、わざわざdynamicを持ち出さなくても、暗黙的変換で十分じゃないの？そのほうが利便性も上じゃないの？と思ったのでやってみたら、やはりドンピシャでした。</p>

<p>暗黙的変換は、あまり使う機能じゃあないと思いますし、実際、乱用すべきでない機能であることには違いないのですが、たまに活用する分には中々刺激的で創造性に満ちています。大昔からあるけれど普段使わない機能だなんて、ロストテクノロジーっぽくて浪漫に溢れています。</p>

<p>さて、ただし活用するにはコード中に型を並べなければならないので、汎用的というわけではないのもそうなのですが、人力で書くのもシンドイところ。勿論人力でやる気はしないので<a href="http://msdn.microsoft.com/ja-jp/library/bb126445.aspx">T4 Template</a>を使いました。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ template language=&quot;C#&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ output extension=&quot;cs&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ assembly Name=&quot;System.Core.dll&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ import namespace=&quot;System&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ import namespace=&quot;System.Linq&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ import namespace=&quot;System.Text.RegularExpressions&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#@ import namespace=&quot;System.Reflection&quot; #&gt;</span>
<span style="color: #008000;">&lt;</span><span style="color: #008080;">#</span>
    <span style="color: #FF0000;">var</span> methods <span style="color: #008000;">=</span> <span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Convert<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">GetMethods</span><span style="color: #000000;">&#40;</span>BindingFlags.<span style="color: #0600FF;">Static</span> | BindingFlags.<span style="color: #0600FF;">Public</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #FF0000;">var</span> converters <span style="color: #008000;">=</span> methods.<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Name</span>.<span style="color: #0000FF;">StartsWith</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;To&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> Regex.<span style="color: #0000FF;">Replace</span><span style="color: #000000;">&#40;</span>x.<span style="color: #0000FF;">Name</span>, <span style="color: #666666;">&quot;^To&quot;</span>, <span style="color: #666666;">&quot;&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">!</span>x.<span style="color: #0000FF;">StartsWith</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Base64&quot;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">&amp;&amp;</span> x <span style="color: #008000;">!=</span> <span style="color: #666666;">&quot;String&quot;</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">Distinct</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        .<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #008080;">#&gt;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Generic</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections.Specialized</span>;
&nbsp;
<span style="color: #0600FF;">namespace</span> Codeplex.<span style="color: #0000FF;">Web</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> NameValueCollectionExtensions
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> ConvertableString ParseValue<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> NameValueCollection source, <span style="color: #FF0000;">string</span> key<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> ParseValue<span style="color: #000000;">&#40;</span>source, key, <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> ConvertableString ParseValue<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> NameValueCollection source, <span style="color: #FF0000;">string</span> key, Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, <span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> converter<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> values <span style="color: #008000;">=</span> source.<span style="color: #0000FF;">GetValues</span><span style="color: #000000;">&#40;</span>key<span style="color: #000000;">&#41;</span>;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>values <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> ConvertableString<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> values<span style="color: #000000;">&#91;</span>0<span style="color: #000000;">&#93;</span>;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> ConvertableString<span style="color: #000000;">&#40;</span>converter <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span> <span style="color: #008000;">?</span> value <span style="color: #008000;">:</span> converter<span style="color: #000000;">&#40;</span>value<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// 中略</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">struct</span> ConvertableString
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">readonly</span> <span style="color: #FF0000;">string</span> Value;
&nbsp;
        <span style="color: #0600FF;">public</span> ConvertableString<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> value<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> value;
        <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008000;">&lt;</span><span style="color: #008080;"># foreach (var converter in converters) { #&gt;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> <span style="color: #008000;">&lt;</span><span style="color: #008080;">#= converter #&gt;(ConvertableString self)</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> KeyNotFoundException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #0600FF;">return</span> <span style="color: #008000;">&lt;</span><span style="color: #008080;">#= converter #&gt;.Parse(self.Value);</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> <span style="color: #008000;">&lt;</span><span style="color: #008080;">#= converter #&gt;?(ConvertableString self)</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008000;">&lt;</span><span style="color: #008080;">#= converter #&gt; value;</span>
            <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #008000;">&lt;</span><span style="color: #008080;">#= converter #&gt;.TryParse(self.Value, out value))</span>
                <span style="color: #008000;">?</span> <span style="color: #008000;">new</span> Nullable<span style="color: #008000;">&lt;&lt;</span><span style="color: #008080;">#= converter #&gt;&gt;(value)</span>
                <span style="color: #008000;">:</span> null;
        <span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008000;">&lt;</span><span style="color: #008080;"># } #&gt;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> <span style="color: #FF0000;">String</span><span style="color: #000000;">&#40;</span>ConvertableString self<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> self.<span style="color: #0000FF;">Value</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> ToString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> Value;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>以上のコードから、T4生成部分を取り出すと</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> Boolean<span style="color: #000000;">&#40;</span>ConvertableString self<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> KeyNotFoundException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">return</span> Boolean.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> Boolean<span style="color: #008000;">?</span><span style="color: #000000;">&#40;</span>ConvertableString self<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    Boolean value;
    <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span> <span style="color: #008000;">&amp;&amp;</span> Boolean.<span style="color: #0000FF;">TryParse</span><span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span>, <span style="color: #0600FF;">out</span> value<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #008000;">?</span> <span style="color: #008000;">new</span> Nullable<span style="color: #008000;">&lt;</span>Boolean<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>value<span style="color: #000000;">&#41;</span>
        <span style="color: #008000;">:</span> null;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> <span style="color: #FF0000;">Char</span><span style="color: #000000;">&#40;</span>ConvertableString self<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> KeyNotFoundException<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">Char</span>.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">implicit</span> <span style="color: #0600FF;">operator</span> <span style="color: #FF0000;">Char</span><span style="color: #008000;">?</span><span style="color: #000000;">&#40;</span>ConvertableString self<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">Char</span> value;
    <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">!=</span> <span style="color: #0600FF;">null</span> <span style="color: #008000;">&amp;&amp;</span> <span style="color: #FF0000;">Char</span>.<span style="color: #0000FF;">TryParse</span><span style="color: #000000;">&#40;</span>self.<span style="color: #0000FF;">Value</span>, <span style="color: #0600FF;">out</span> value<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #008000;">?</span> <span style="color: #008000;">new</span> Nullable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">Char</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>value<span style="color: #000000;">&#41;</span>
        <span style="color: #008000;">:</span> null;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 以下SByte, Byte, Int16, Int32, Int64, ..., DateTimeと繰り返し</span></pre></div></div>


<p>といったコードがジェネレートされます。清々しいまでのゴリ押しっぷり。一周回ってむしろエレガント。ConvertableStringのほうでKeyNotFoundExceptionを出すのがイケてないのですが、まあそこはShoganaiかなー、ということで。さて、それはそれとして、やっぱVisual Studioに組み込みで、こういった自動生成のテンプレートエンジンが用意されているというのは非常に嬉しいところです。</p>

<h2>まとめ</h2>

<p>特にASP.NETを使っている方々にどうぞ。ASP.NET MVCの人はしらにゃい。なのでいつもの私だったら.NET 4.0専用にするところが、今回は.NET 3.5でも大丈夫！Visual Studio 2008でも動作確認取りました！</p>

<p>それにしても実際ASP.NETを使いこなしてる人はクエリストリングの取得はどんな風にやっていたものなのでしょうかー。何かしらの手法がないとシンドすぎやしませんか？そう思って検索してみたんですが、どうにも見つからず。さすがに ParseValueAsInt() とかって拡張メソッドぐらい作ってやり繰りは私も大昔していたし、それでintに対応しておけばほぼほぼOKではありますが（拡張メソッドがなかった時代はさすがに想像したくない！）。そう考えると、ちょっとこれはやりすぎ感も若干。でも、一度できあがればずっと使えますしね。というわけで<a href="http://implicitquerystring.codeplex.com/">ImplicitQueryString</a>、是非是非使ってみてください。本当に楽になれると思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/02/18_365.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>dynamicとQueryString、或いは無限に不確定なオプション引数について</title>
		<link>http://neue.cc/2012/02/14_364.html</link>
		<comments>http://neue.cc/2012/02/14_364.html#comments</comments>
		<pubDate>Mon, 13 Feb 2012 17:53:10 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/02/14_364.html</guid>
		<description><![CDATA[どうもこんばんわ、30時間も寝てないわー。まあ、お陰で真昼間の就業中にうつらうつらしてましたが！ちなみにGRAVITY DAZEにはまって延々とプレイしてたから寝てないだけです。PS陣営にくだるなんて！さて、それはそれとしてBlog更新頻度の]]></description>
			<content:encoded><![CDATA[<p>どうもこんばんわ、30時間も寝てないわー。まあ、お陰で真昼間の就業中にうつらうつらしてましたが！ちなみに<a href="http://www.jp.playstation.com/scej/title/gravitydaze/">GRAVITY DAZE</a>にはまって延々とプレイしてたから寝てないだけです。PS陣営にくだるなんて！さて、それはそれとしてBlog更新頻度の低下っぷりはお察し下さい。そんなこんなで最近の仕事（仕事ですって！仕事してるんですって！？）はASP.NETなんですが、色々アレですね。ふふふ。ソウルジェムは真っ黒と真っ白を行ったり来たりしてて楽しいです。まあ、ようするに楽しいです。楽しいのはいいとしてBlogが停滞するのはいくないので、電車でGRAVITY DAZEやりながらQueryStringうぜえええええ、とか悶々としたので帰り道に殺害する算段を整えていました。</p>

<p>QueryStringって、qとかnumとかiとかsとか、それそのものだけじゃ何を指してるかイミフなので、C#的にはちゃんと名前をつけてやりたいよね。だから、ただシンプルに触れるというだけじゃダメで。あと、コンバートもしたいよね。数字はintにしたいしboolは当然boolなわけで。さて、そんな時に私たちが持つツールと言ったら、dynamicです。C#とスキーマレスな世界を繋ぐ素敵な道具。今日も活躍してもらうことにしましょう。たまにしか出番ないですからね。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span> id;
<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">int</span><span style="color: #008000;">?</span> count;
<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> keyword;
<span style="color: #0600FF;">private</span> <span style="color: #FF0000;">bool</span> isOrdered;
&nbsp;
<span style="color: #0600FF;">protected</span> <span style="color: #0600FF;">void</span> Page_Load<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// id=10&amp;c=100&amp;q=hogehoge&amp;od=true というクエリストリングが来る場合</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// dynamicに変換！</span>
    <span style="color: #FF0000;">var</span> query <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Request</span>.<span style="color: #0000FF;">QueryString</span>.<span style="color: #0000FF;">AsDynamic</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    id <span style="color: #008000;">=</span> query.<span style="color: #0000FF;">id</span>; <span style="color: #008080; font-style: italic;">// キャストは不要、書くの楽ですね！(キーが存在しないと例外)</span>
    count <span style="color: #008000;">=</span> query.<span style="color: #0000FF;">c</span>; <span style="color: #008080; font-style: italic;">// 型がnullableならば、存在しなければnull</span>
    keyword <span style="color: #008000;">=</span> query.<span style="color: #0000FF;">q</span>; <span style="color: #008080; font-style: italic;">// stringの場合も存在しない場合はnull</span>
    isOrdered <span style="color: #008000;">=</span> query.<span style="color: #0000FF;">od</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// メソッドのように値を渡すと、キーが存在しない場合のデフォルト値になる</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>ASP.NETの例ですが、どうでしょう、まぁまぁ良い感じじゃあなくて？ちなみに最初はnull合体演算子(??)を使いたかったのですが、DynamicObjectでラップした時点で、そもそも存在がnullじゃないということで、何をどうやってもうまく活用できなくて泣いた。しょうがないのでメソッド形式でデフォルト値を渡すことでそれっぽいような雰囲気に誤魔化すことにしました、とほほほ。</p>

<h2>dynamicとオプション引数</h2>

<p>クエリストリングを生成することも出来ます。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 戻り値はdynamicで空のDynamicQueryStringを生成</span>
<span style="color: #FF0000;">var</span> query <span style="color: #008000;">=</span> DynamicQueryString.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// オプション引数の形式で書くと……？</span>
query<span style="color: #000000;">&#40;</span>id<span style="color: #008000;">:</span> <span style="color: #FF0000;">100</span>, c<span style="color: #008000;">:</span> <span style="color: #FF0000;">100</span>, q<span style="color: #008000;">:</span> <span style="color: #666666;">&quot;hogehoge&quot;</span>, od<span style="color: #008000;">:</span> <span style="color: #0600FF;">true</span><span style="color: #000000;">&#41;</span>;
&nbsp;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>query.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// id=10&amp;c=100&amp;q=hogehoge&amp;od=true</span></pre></div></div>


<p>といった感じで、面白いのがオプション引数の使い方。匿名型渡しのように、スマートにKey:Valueを渡すことを実現しています。dynamicなので引数名は完全自由。個数も完全自由。非常にC#らしくなくC#らしいところが最高にCOOL。匿名型とどちらがいいの？というと何とも言えないところですが、面白いには違いないし、面白いは正義。C#も工夫次第でまだまだ色々なやり方が模索できるんですよー、ってところです。</p>

<h2>実装など</h2>

<p>眠いのでコードの解説はしません（ぉ。DynamicObjectの実装方法は<a href="http://neue.cc/2010/05/06_257.html">neue cc - C# DynamicObjectの基本と細かい部分について</a>でどーぞ。overrideしていくだけなので、別に難しくもなんともないので是非是非やってみてください。ちなみに無限のオプション引数を実現している箇所は binder.CallInfo.ArgumentNames.Zip(args, (key, value) => new { key, value }) です。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> NameValueCollectionExtensions
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">dynamic</span> AsDynamic<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> NameValueCollection queryString<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> DynamicQueryString<span style="color: #000000;">&#40;</span>queryString<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> DynamicQueryString <span style="color: #008000;">:</span> DynamicObject
<span style="color: #000000;">&#123;</span>
    NameValueCollection source;
&nbsp;
    <span style="color: #0600FF;">public</span> DynamicQueryString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">source</span> <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> NameValueCollection<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> DynamicQueryString<span style="color: #000000;">&#40;</span>NameValueCollection queryString<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">source</span> <span style="color: #008000;">=</span> queryString;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">dynamic</span> Create<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> DynamicQueryString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> TryGetMember<span style="color: #000000;">&#40;</span>GetMemberBinder binder, <span style="color: #0600FF;">out</span> <span style="color: #FF0000;">object</span> result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> source<span style="color: #000000;">&#91;</span>binder.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#93;</span>;
        result <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringMember<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span>value <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">?</span> value <span style="color: #008000;">:</span> value.<span style="color: #0000FF;">Split</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">','</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">FirstOrDefault</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #0600FF;">return</span> true;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> TryInvoke<span style="color: #000000;">&#40;</span>InvokeBinder binder, <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args, <span style="color: #0600FF;">out</span> <span style="color: #FF0000;">object</span> result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> item <span style="color: #0600FF;">in</span> binder.<span style="color: #0000FF;">CallInfo</span>.<span style="color: #0000FF;">ArgumentNames</span>.<span style="color: #0000FF;">Zip</span><span style="color: #000000;">&#40;</span>args, <span style="color: #000000;">&#40;</span>key, value<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> <span style="color: #000000;">&#123;</span> key, value <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            source.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">key</span>, item.<span style="color: #0000FF;">value</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        result <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #0600FF;">return</span> true;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> TryConvert<span style="color: #000000;">&#40;</span>ConvertBinder binder, <span style="color: #0600FF;">out</span> <span style="color: #FF0000;">object</span> result<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>binder.<span style="color: #0000FF;">Type</span> <span style="color: #008000;">!=</span> <span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            result <span style="color: #008000;">=</span> null;
            <span style="color: #0600FF;">return</span> false;
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">else</span>
        <span style="color: #000000;">&#123;</span>
            result <span style="color: #008000;">=</span> <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #0600FF;">return</span> true;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> ToString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #FF0000;">string</span>.<span style="color: #0000FF;">Join</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&amp;&quot;</span>, source.<span style="color: #0000FF;">Cast</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>key <span style="color: #008000;">=&gt;</span> key <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;=&quot;</span> <span style="color: #008000;">+</span> source<span style="color: #000000;">&#91;</span>key<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> IEnumerable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> GetDynamicMemberNames<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> source.<span style="color: #0000FF;">Cast</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #FF0000;">class</span> StringMember <span style="color: #008000;">:</span> DynamicObject
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">readonly</span> <span style="color: #FF0000;">string</span> value;
&nbsp;
        <span style="color: #0600FF;">public</span> StringMember<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> value<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">value</span> <span style="color: #008000;">=</span> value;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> TryInvoke<span style="color: #000000;">&#40;</span>InvokeBinder binder, <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args, <span style="color: #0600FF;">out</span> <span style="color: #FF0000;">object</span> result<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #FF0000;">var</span> defaultValue <span style="color: #008000;">=</span> args.<span style="color: #0000FF;">First</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #0600FF;">try</span>
            <span style="color: #000000;">&#123;</span>
                result <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>value <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #008000;">?</span> defaultValue
                    <span style="color: #008000;">:</span> Convert.<span style="color: #0000FF;">ChangeType</span><span style="color: #000000;">&#40;</span>value, defaultValue.<span style="color: #0000FF;">GetType</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>FormatException<span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// 真面目にやるならType.GetTypeCodeでTypeを分けて、例外キャッチじゃなくてTryParseのほうがいいかな？</span>
            <span style="color: #000000;">&#123;</span>
                result <span style="color: #008000;">=</span> defaultValue;
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> true;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">bool</span> TryConvert<span style="color: #000000;">&#40;</span>ConvertBinder binder, <span style="color: #0600FF;">out</span> <span style="color: #FF0000;">object</span> result<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">try</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #FF0000;">var</span> type <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>binder.<span style="color: #0000FF;">Type</span>.<span style="color: #0000FF;">IsGenericType</span> <span style="color: #008000;">&amp;&amp;</span> binder.<span style="color: #0000FF;">Type</span>.<span style="color: #0000FF;">GetGenericTypeDefinition</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">==</span> <span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Nullable<span style="color: #008000;">&lt;&gt;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #008000;">?</span> binder.<span style="color: #0000FF;">Type</span>.<span style="color: #0000FF;">GetGenericArguments</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">First</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #008000;">:</span> binder.<span style="color: #0000FF;">Type</span>;
&nbsp;
                result <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>value <span style="color: #008000;">==</span> <span style="color: #0600FF;">null</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #008000;">?</span> <span style="color: #0600FF;">null</span>
                    <span style="color: #008000;">:</span> Convert.<span style="color: #0000FF;">ChangeType</span><span style="color: #000000;">&#40;</span>value, binder.<span style="color: #0000FF;">Type</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">catch</span> <span style="color: #000000;">&#40;</span>FormatException<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                result <span style="color: #008000;">=</span> null;
            <span style="color: #000000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF;">return</span> true;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">override</span> <span style="color: #FF0000;">string</span> ToString<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">return</span> value <span style="color: #008000;">??</span> <span style="color: #666666;">&quot;&quot;</span>;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>コンバートに対応させるために、要素一つだけのDynamicObjectを中で用意しちゃってます。そこがポイント、といえばポイント、かしら。GetDynamicMemberNamesはデバッガの「動的ビュー」に表示されるので、Visual Studioに優しいコードを書くなら必須ですね。</p>

<h2>まとめ</h2>

<p>dynamicはC#と外の世界を繋ぐためのもの。今日もまた一つ繋いでしまった。それはともかくとして、一番最初、<a href="http://dynamicjson.codeplex.com/">DynamicJson</a>を実装した頃にも言ったのですが、dynamicはDSL的な側面もあって、普通に楽しめますので、ちょっと頭をひねって活用してみると、また一つ、素敵な世界が待っています。</p>

<p>今回はコード書くのに2時間、この記事を書くのに1時間、でしたー。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/02/14_364.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>C#のO/Rマッパーのパフォーマンス測定 Part2</title>
		<link>http://neue.cc/2012/01/17_363.html</link>
		<comments>http://neue.cc/2012/01/17_363.html#comments</comments>
		<pubDate>Tue, 17 Jan 2012 14:54:34 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/01/17_363.html</guid>
		<description><![CDATA[以前にneue cc - C#のMicro-ORM(Dapper, Massive, PetaPoco)についてで計測したのですが、@shibayan先生がEF 4.1のDbContextのRaw SQL Queriesはどうなの？とTwitterで言ってたのを見かけたので、再度測ってみました。ていうか私はDbContextとObjectContextの違いすら分かってないんですが、DbContextは軽量な感じっぽいそうです、はい。

ベンチマー]]></description>
			<content:encoded><![CDATA[<p>以前に<a href="http://neue.cc/2011/06/03_326.html">neue cc - C#のMicro-ORM(Dapper, Massive, PetaPoco)について</a>で計測したのですが、<a href="https://twitter.com/shibayan">@shibayan</a>先生が<a href="http://blogs.msdn.com/b/adonet/archive/2011/02/04/using-dbcontext-in-ef-feature-ctp5-part-10-raw-sql-queries.aspx">EF 4.1のDbContextのRaw SQL Queries</a>はどうなの？とTwitterで言ってたのを見かけたので、再度測ってみました。ていうか私はDbContextとObjectContextの違いすら分かってないんですが、DbContextは軽量な感じっぽいそうです、はい。</p>

<p>ベンチマークは前回と引き続き<a href="http://code.google.com/p/dapper-dot-net/">dapper-dot-net</a>のリポジトリにあるベンチを使用しました。それにEFのバージョンを4.2に上げて、DbContextのSqlQueryを追加。また、<a href="http://d.hatena.ne.jp/taedium/">id:taedium</a>さんの作られている<a href="http://soma.codeplex.com/">Soma</a>は最新バージョンの1.6にしておきました。そして私の作成しているMicro-ORMである<a href="http://dbexecutor.codeplex.com/">DbExecutor</a>のベンチも引き続き載せています。Visual Studio 2005時代のデータアクセステクノロジである型付きDataSetも加えてあります。</p>

<blockquote>
  <p>Mapper Query (non-buffered) took 55ms<br />
  Dynamic Mapper Query (buffered) took 56ms<br />
  Dynamic Mapper Query (non-buffered) took 56ms<br />
  hand coded took 57ms<br />
  <strong>DbExecutor ExecuteReader(Hand Coded) took 59ms</strong><br />
  Dapper.Cotrib took 60ms<br />
  OrmLite QueryById took 60ms<br />
  <strong>DbExecutor Select took 60ms</strong><br />
  Mapper Query (buffered) took 61ms<br />
  PetaPoco (Fast) took 62ms<br />
  PetaPoco (Normal) took 63ms<br />
  <strong>DbExecutor SelectDynamic took 63ms</strong><br />
  Dynamic Massive ORM Query took 64ms<br />
  <strong>DbExecutor ExecuteReaderDynamic(Hand Coded) took 64ms</strong><br />
  BLToolkit took 82ms<br />
  Simple.Data took 87ms<br />
  Linq 2 SQL Compiled took 96ms<br />
  DataSet took 108ms<br />
  SubSonic Coding Horror took 116ms<br />
  Entity framework CompiledQuery took 120ms<br />
  NHibernate SQL took 125ms<br />
  NHibernate Session.Get took 128ms<br />
  NHibernate HQL took 135ms<br />
  Soma Find took 164ms<br />
  NHibernate Criteria took 170ms<br />
  Linq 2 SQL ExecuteQuery took 207ms<br />
  Linq 2 SQL took 597ms<br />
  NHibernate LINQ took 610ms<br />
  Entity framework ExecuteStoreQuery took 634ms<br />
  Entity framework DbContext SqlQuery took 670ms<br />
  Entity framework ESQL took 725ms<br />
  Entity framework took 900ms<br />
  Entity framework No Tracking took 903ms<br />
  SubSonic ActiveRecord.SingleOrDefault took 3736ms</p>
</blockquote>

<p>hand codedがExecuteReaderを手で回した手書き、「Mapper Query」はDapperのことです。複数種類があるのはオプション違い。DbExecutor(太字にしています)も同様に4種類で測っています。上位陣は何回も測ると適当に入れ替わりますし、速度的にも500回ブン回して数msとか、ほとんど誤差範囲でいいのではかと思います。</p>

<p>というわけで、ええと、EntityFrameworkの遅さが目立ちますね、CompiledQueryは割といいのですが、むしろそうしないと絶望的。特に、文字列で生SQLを書くはずのExecuteStoreQueryやSqlQueryがクソみたいに遅いのはどういうことなのかと問いつめたい。更に、軽量なはずのDbContextのSqlQueryよりもObjectContextのExecuteStoreQueryのほうが速いとか、頭痛くなります。オマケ機能だと思ってテキトーなのではかと思われる気がかなりします、MSもっと本気出せ。</p>

<p>DataSetが割と健闘しちゃってるのが、DataSet嫌いな私としては何とも言い難い感じです(笑)</p>

<p>まぁ、DbExecutorが速さと使い勝手を両立しているので、Micro-ORMでいいならDbExecutor使うといいですよ、はい。メンテしてないって？はい、そうですね……。割と真面目な話、色々機能拡張したいというかしなければならない必然性とかが迫っていたりしたりしなかったりするので、近いうちに再度動き出すつもりではいます。なので使ってみるといいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/01/17_363.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>XboxInfoTwit - ver.2.4.0.2</title>
		<link>http://neue.cc/2012/01/16_362.html</link>
		<comments>http://neue.cc/2012/01/16_362.html#comments</comments>
		<pubDate>Sun, 15 Jan 2012 21:46:26 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[XboxInfoTwit]]></category>

		<guid isPermaLink="false">http://neue.cc/2012/01/16_362.html</guid>
		<description><![CDATA[
neue cc - XboxInfoTwit


Xbox.comがリニューアルしたので、それに対応しました。今回は3日ほど本気で気づいていなくて対応が遅れてごめんなさい。最近はコメントやリクエストも放置気味で、大変反省しています。転職して少し忙しくなって、あま]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://neue.cc/software/xboxinfotwit" title="neue cc - XboxInfoTwit">neue cc - XboxInfoTwit</a></li>
</ul>

<p>Xbox.comがリニューアルしたので、それに対応しました。今回は3日ほど本気で気づいていなくて対応が遅れてごめんなさい。最近はコメントやリクエストも放置気味で、大変反省しています。転職して少し忙しくなって、あまり気が回らなくて、という言い訳カッコワルイ。もう少し頑張ります。例によって全くテストしてないので、こいつ放置気味だしどうせ反応してくれないしいいかー、とか思わず、どうか変なところあったら報告お願いいたします。</p>

<p>あ、あと、今回からエラー時に前回の状態をリセットしないように変更しました。どういうことかというと、何らかのエラー(Xbox.comが不調だったり←よくある、Twitterが不調だったり)によって状態がリセットされた結果として、Power Onの投稿が連投されたりしてナンジャコリャー、といったような状態になることが防げます。多分。恐らく。きっと。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2012/01/16_362.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>2011年を振り返る</title>
		<link>http://neue.cc/2011/12/30_361.html</link>
		<comments>http://neue.cc/2011/12/30_361.html#comments</comments>
		<pubDate>Fri, 30 Dec 2011 07:25:42 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[Misc]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/12/30_361.html</guid>
		<description><![CDATA[一年、ありがとうございました。何とか生き延びれました。ブログも冬眠せず続けられましたし、よきかなよきかな。

今年は色々ありました。やはり一番大きかったのはMicrosoft MVP for Visual C#の受賞ですね。と、いっても、今まで通りブログを]]></description>
			<content:encoded><![CDATA[<p>一年、ありがとうございました。何とか生き延びれました。ブログも冬眠せず続けられましたし、よきかなよきかな。</p>

<p>今年は色々ありました。やはり一番大きかったのは<a href="http://neue.cc/2011/04/02_313.html">Microsoft MVP for Visual C#</a>の受賞ですね。と、いっても、今まで通りブログを書いてライブラリを書いて、というわけで、別に今までと何が変わったわけでもありません。ただ、肩書きとして威力があったりなかったり、というのはあります。あと、出す情報に関してはある程度は責任というか、適当すぎることは書けないかな、という意識は持ちました。</p>

<p>良くも悪くもといえば、やはりラベルが貼られると、ラベルに沿って動いてしまうというのが人の性かもしれません。少しC#贔屓が強くなりすぎたかもねー、とか。ちょっと反省。それと、他の言語を全然学べなかったなあ、というのもよくなかった。今年はちょっと色々なことに追われすぎたというかRx-WP7-Async-Roslynと、C#だけでいっぱいいっぱいだったのです……。結局Roslynはあまり追えてないし。</p>

<p>@ITでの連載 <a href="http://www.atmarkit.co.jp/fdotnet/introrx/index/index.html">Reactive Extensions（Rx）入門 － ＠IT</a> がスタートしたり、C#ユーザー会で<a href="http://www.slideshare.net/neuecc/code-contracts-8069150">基礎からのCode Contracts</a>、すまべんで<a href="http://www.slideshare.net/neuecc/reactive-extensions-8049041">Reactive Extensionsで非同期処理を簡単に</a>、Silverlight Squareで<a href="http://www.slideshare.net/neuecc/reactiveproperty-slintokyo4">ReactiveProperty - slintokyo4</a>といった、幾つかの勉強会で発表させて頂いたりなど、結構動き出した年でもありました。</p>

<h2>ゲーム</h2>

<p>死ぬほどプレイ、しなかった……。積みゲーどころか買ったけど封すら開けなかったり。こんな私は想像できなかったなあ。しかも別に時間がないわけじゃなくてさあ、だらだらとネット見てTwitter見てるだけなんですよ。ただ無駄に時間を捨てているだけで。楽しみだったはずのSkyrimにすら手を出していない。ふぅー、来年はちゃんとメリハリつけて付き合いたいものです。ねえ、だらだらネット見てるだけって、だらだらTV見てるだけと何も違わないぢゃあないか。</p>

<h2>C#</h2>

<p>ライブラリも色々作りました。その時の関心ごとに応じて、徹底的に調べて、不満をライブラリ作って解消する、というのが基本的なスタイルでした。ユニットテストの書き方が気に入らないから<a href="http://chainingassertion.codeplex.com/">Chaining Assertion</a>を作り、DBへの生クエリ周りが気に入らないから<a href="http://dbexecutor.codeplex.com/">DbExecutor</a>を作り、INotifyPropertyChangedが気に入らないから<a href="http://reactiveproperty.codeplex.com/">ReactiveProperty</a>を作った。関心ごとが見つかったら、深くダイブして、新しいやり方を見つけ出す。なんていうとご立派ですが、本当に新しいこと、なんてないのですよね。既存の断片は幾らでも見つかる。だから、それらもまた徹底的に調査して、そして、自分の気にいるように融和させていく。</p>

<p>ずっと<a href="http://linqjs.codeplex.com/">linq.js - LINQ for JavaScript</a>をlowerCamelCaseに変更する！と思ってたのですが未だにできてはいなくて。よくないですね。ちょうど今日、新しい<a href="http://nuget.org/packages/RxJS-All">Reactive Extensions for JavaScript</a>が出ました。詳しくは年明け早々に紹介したいと思いますが、これはちゃんとlowerCamelCaseになってます。いつまでも遅れていちゃマズい。</p>

<h2>来年</h2>

<p>ここで言うことか？という話ではありますが、12月で会社を退職し(て)ました。1月からは新しい会社で働くことになります。次の会社でもC#をメインにやっていきます（ということで雇われるわけでもありますので）。しっかり成果を出していきたいし、事例やコードなんかも、出せるならガシガシ出したいと思っています。その辺のことは追々。</p>

<p>来年は、MVP絡みで米MS本社でのMVP Global Summitもあり、新しい会社で働く（初めての転職です）ことにもなるしで、私としてもかなり転機な年になるのではという予感がしています。不安もありますが、同時に楽しみでもあります。<a href="http://neue.cc/2010/12/31_294.html">2010年を振り返る</a>で、来年には更なる成長のために動き出したい、などと言っていましたが、一応はしっかりとスタートを踏み出せたようです。</p>

<p>そんな感じですが、来年もよろしくお願いします。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/12/30_361.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>RxとパフォーマンスとユニットテストとMoles再び</title>
		<link>http://neue.cc/2011/12/21_360.html</link>
		<comments>http://neue.cc/2011/12/21_360.html#comments</comments>
		<pubDate>Wed, 21 Dec 2011 00:26:10 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<category><![CDATA[Rx]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/12/21_360.html</guid>
		<description><![CDATA[C# Advent Calendar 2011、順調に進んでいますね。どのエントリも力作で大変素晴らしいです。私はこないだModern C# Programming Style Guideというものを書きました。はてブ数は現段階で45、うーん、あまり振るわない……。私の力不足はともかくとしても、他の言語だったらもっと]]></description>
			<content:encoded><![CDATA[<p><a href="http://atnd.org/events/21988">C# Advent Calendar 2011</a>、順調に進んでいますね。どのエントリも力作で大変素晴らしいです。私はこないだ<a href="http://neue.cc/2011/12/16_359.html">Modern C# Programming Style Guide</a>というものを書きました。はてブ数は現段階で45、うーん、あまり振るわない……。私の力不足はともかくとしても、他の言語だったらもっと伸びてるだろうに、と思うと、日本のC#の現状はそんなものかなあ、はぁ、という感じではあります。はてブが全てではない（むしろ斜陽？）とはいえ、Twitterでの言及数などを見ても、やっぱまだまだまだまだまだまだ厳しいかなあ、といったところ。Unityなどもあって、見ている限りだと人口自体は着実に増えている感じではありますけれど、もっともっと、関心持ってくれる人が増えるといいな。私も微力ながら尽力したいところです。</p>

<p>ところで、<a href="http://d.hatena.ne.jp/ZOETROPE/">id:ZOETROPE</a>さんのAdvent Calendarの記事、<a href="http://d.hatena.ne.jp/ZOETROPE/20111220#1324392149">Reactive Extensionsでセンサプログラミング</a>が大変素晴らしい！センサー、というと私だとWindows Phone 7から引っ張ってくるぐらいしか浮かばないのですが（最近だとKinectもHotですか、私は全然触れてませんが……）おお、USB接続のレンジセンサ！完全に門外漢な私としては、そういうのもあるのか！といったぐらいなわけですが、こうしてコード見させていただくと、実践的に使うRxといった感じでとてもいいです。</p>

<p>記事中で扱われているトピックも幅広いわけですが、まず、パフォーマンスに関しては少し補足を。@okazukiさんの<a href="http://d.hatena.ne.jp/okazuki/20111214/1323828027">見せてもらおうじゃないかReactive Extensionsの性能とやらを！ その２</a>のコメント欄でもちょっと言及したのですが、この測り方の場合、Observable.Rangeに引っ張られているので、ベンチマークの値はちょっと不正確かな、と思います。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 1000回イベントが発火(発火の度に長さ3000のbyte配列が得られる)を模写</span>
<span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">&gt;</span> DummyEventsRaised<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> Observable.<span style="color: #0000FF;">Repeat</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">3000</span><span style="color: #000000;">&#93;</span>, <span style="color: #FF0000;">1000</span>, Scheduler.<span style="color: #0000FF;">Immediate</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 配列をバラす処理にObservable.Rangeを用いた場合</span>
<span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #008000;">&gt;</span> TestObservableRange<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> Observable.<span style="color: #0000FF;">Create</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>observer <span style="color: #008000;">=&gt;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> DummyEventsRaised<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>xs <span style="color: #008000;">=&gt;</span>
            <span style="color: #000000;">&#123;</span>
                Observable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span>0, xs.<span style="color: #0000FF;">Length</span>, Scheduler.<span style="color: #0000FF;">Immediate</span><span style="color: #000000;">&#41;</span>.<span style="color: #0600FF;">ForEach</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> observer.<span style="color: #0000FF;">OnNext</span><span style="color: #000000;">&#40;</span>xs<span style="color: #000000;">&#91;</span>x<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 配列をバラす処理にEnumerable.Rangeを用いた場合(ForEachはIxのもの)</span>
<span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #008000;">&gt;</span> TestEnumerableRange<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> Observable.<span style="color: #0000FF;">Create</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>observer <span style="color: #008000;">=&gt;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> DummyEventsRaised<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>xs <span style="color: #008000;">=&gt;</span>
            <span style="color: #000000;">&#123;</span>
                Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span>0, xs.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>.<span style="color: #0600FF;">ForEach</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> observer.<span style="color: #0000FF;">OnNext</span><span style="color: #000000;">&#40;</span>xs<span style="color: #000000;">&#91;</span>x<span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// SelectManyでバラす場合</span>
<span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #008000;">&gt;</span> TestSelectMany<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> DummyEventsRaised<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">SelectMany</span><span style="color: #000000;">&#40;</span>xs <span style="color: #008000;">=&gt;</span> xs<span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// ベンチマーク補助関数</span>
    Action<span style="color: #008000;">&lt;</span>Action, <span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> bench <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>action, label<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> sw <span style="color: #008000;">=</span> Stopwatch.<span style="color: #0000FF;">StartNew</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        action<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{0,-12}{1}&quot;</span>, label, sw.<span style="color: #0000FF;">Elapsed</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>;
&nbsp;
    <span style="color: #008080; font-style: italic;">// 配列をばらすケースは再度連結する(ToList)</span>
    bench<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> TestObservableRange<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;Ob.Range&quot;</span><span style="color: #000000;">&#41;</span>;
    bench<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> TestEnumerableRange<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;En.Range&quot;</span><span style="color: #000000;">&#41;</span>;
    bench<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> TestSelectMany<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToList</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;SelectMany&quot;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #008080; font-style: italic;">// 配列をばらして連結せず直接処理する場合</span>
    bench<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> TestSelectMany<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;DirectRx&quot;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #008080; font-style: italic;">// byte[]をばらさず直接処理する場合</span>
    bench<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> DummyEventsRaised<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>xs <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> x <span style="color: #0600FF;">in</span> xs<span style="color: #000000;">&#41;</span>;<span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;DirectLoop&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #008080; font-style: italic;">// 実行結果</span>
    <span style="color: #008080; font-style: italic;">// Ob.Range    00:00:02.2619670</span>
    <span style="color: #008080; font-style: italic;">// En.Range    00:00:00.2600460</span>
    <span style="color: #008080; font-style: italic;">// SelectMany  00:00:00.2701137</span>
    <span style="color: #008080; font-style: italic;">// DirectRx    00:00:00.0852836</span>
    <span style="color: #008080; font-style: italic;">// DirectLoop  00:00:00.0152816</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>得られる配列をダイレクトに処理するとして、Observable.Rangeで配列のループを回すと論外なほど遅い。のですが、しかし、この場合ですとEnumerable.Rangeで十分なわけで、そうすれば速度は全然変わってきます（もっと言えば、ここではEnumerable.Rangeではなくforeachを使えば更に若干速くなります）。更に、これは配列を平坦化している処理とみなすことができるので、observerを直に触らず、SelectManyを使うこともできますね。そうすれば速度はほとんど変わらず、コードはよりすっきり仕上がります。</p>

<p>と、いうわけで、遅さの原因はObservable.Rangeです。Rangeが遅いということはRepeatやGenerateなども同様に遅いです。遅い理由は、値の一つ一つをISchedulerを通して流しているから。スケジューラ経由であることは大きな柔軟性をもたらしていますが、直にforeachするよりもずっとずっと遅くなる。なので、Enumerableで処理出来る局面ならば、Enumerableを使わなければなりません。これは、使うほうがいい、とかではなくて、圧倒的な速度差となるので、絶対に、Enumerableのほうを使いましょう。</p>

<p>また、一旦配列をバラして、再度連結というのは、無駄極まりなく、大きな速度差にも現れてきます。もし再度連結しないでそのまま利用(ベンチ結果：DirectRx)すれば直接ループを回す(ベンチ結果：DirectLoop)よりも5倍程度の遅さで済んでいます。このぐらいなら許容範囲と言えないでしょうか？とはいえ、それでも、遅さには違いないわけで、避けれるのならば避けたほうがよいでしょう。</p>

<p>ZOETROPEさんの記事にあるように、ここはばらさないほうが良い、というのが結論かなあ、と思います。正しくは上流ではばらさない。一旦バラしたものは復元不可能です。LINQで、パイプラインで処理を接続することが可能という性質を活かすのならば、なるべく後続で自由の効く形で流してあげたほうがいい。アプリケーション側でバラす必要があるなら、それこそSelectMany一発でばらせるのだから。</p>

<p>例えばWebRequestで配列状態のXMLを取ってくるとします。要素は20個あるとしましょう。最初の文字列状態だけを送られてもあまり意味はないので、XElement.Parseして、実際のクラスへのマッピングまではやります。例えばここではPersonにマッピングするとして、長さ1のIObservable&lt;Person[]>です。しかし、それをSelectManyして長さ20のIObservable&lt;Person>にはしないほうがいい。ここでバラしてしまうと長さという情報は消滅してしまうし、一回のリクエスト単位ではなくなるのも不都合が生じやすい。もしアプリケーション的にフラットになっていたほうが都合が良いのなら、それはまたそれで別のメソッドとして切り分けましょう。</p>

<h2>成功と失敗の一本化</h2>

<p>ZOETROPEさんの記事の素晴らしいのは、通常のルート(DataReceived)と失敗のルート(ErrorReceived)を混ぜあわせているところ！これもまたイベントの合成の一つの形なわけなんですねー。こういう事例はWebClientのDownloadStringAsyncのような、EAP(Eventbased Asynchronous Programming)をTaskCompletionSourceでラップしてTaskに変換する <a href="http://msdn.microsoft.com/ja-jp/library/ee622454.aspx">方法: タスクに EAP パターンをラップする</a>←なんかゴチャゴチャしていますが、TrySetCanceled, TrySetException, TrySetResultで結果を包んでいます、というのと似た話だと見なせます。</p>

<p>WebClientではEventArgsがCancelledやErrorといったステータスを持っているのでずっと単純ですが、SerialPortではエラーは別のイベントでやってくるのですね。というわけで、私もラップしてみました。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">class</span> SerialPortExtensions
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// 面倒くさいけれど単純なFromEventでのイベントのRx化</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span>SerialDataReceivedEventArgs<span style="color: #008000;">&gt;</span> DataReceivedAsObservable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> SerialPort serialPort<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> Observable.<span style="color: #0000FF;">FromEvent</span><span style="color: #008000;">&lt;</span>SerialDataReceivedEventHandler, SerialDataReceivedEventArgs<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>
            h <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#40;</span>sender, e<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> h<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span>, h <span style="color: #008000;">=&gt;</span> serialPort.<span style="color: #0000FF;">DataReceived</span> <span style="color: #008000;">+=</span> h, h <span style="color: #008000;">=&gt;</span> serialPort.<span style="color: #0000FF;">DataReceived</span> <span style="color: #008000;">-=</span> h<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span>SerialErrorReceivedEventArgs<span style="color: #008000;">&gt;</span> ErrorReceivedAsObservable<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> SerialPort serialPort<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> Observable.<span style="color: #0000FF;">FromEvent</span><span style="color: #008000;">&lt;</span>SerialErrorReceivedEventHandler, SerialErrorReceivedEventArgs<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>
            h <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#40;</span>sender, e<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> h<span style="color: #000000;">&#40;</span>e<span style="color: #000000;">&#41;</span>, h <span style="color: #008000;">=&gt;</span> serialPort.<span style="color: #0000FF;">ErrorReceived</span> <span style="color: #008000;">+=</span> h, h <span style="color: #008000;">=&gt;</span> serialPort.<span style="color: #0000FF;">ErrorReceived</span> <span style="color: #008000;">-=</span> h<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #008080; font-style: italic;">// DataReceived(プラスbyte[]化)とErrorReceivedを合成する</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">&gt;</span> ObserveReceiveBytes<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> SerialPort serialPort<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> received <span style="color: #008000;">=</span> serialPort.<span style="color: #0000FF;">DataReceivedAsObservable</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">TakeWhile</span><span style="color: #000000;">&#40;</span>e <span style="color: #008000;">=&gt;</span> e.<span style="color: #0000FF;">EventType</span> <span style="color: #008000;">!=</span> SerialData.<span style="color: #0000FF;">Eof</span><span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// これでOnCompletedを出す</span>
            .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>e <span style="color: #008000;">=&gt;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #FF0000;">var</span> buf <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">byte</span><span style="color: #000000;">&#91;</span>serialPort.<span style="color: #0000FF;">BytesToRead</span><span style="color: #000000;">&#93;</span>;
                serialPort.<span style="color: #0000FF;">Read</span><span style="color: #000000;">&#40;</span>buf, 0, buf.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>;
                <span style="color: #0600FF;">return</span> buf;
            <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #FF0000;">var</span> error <span style="color: #008000;">=</span> serialPort.<span style="color: #0000FF;">ErrorReceivedAsObservable</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Take</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// 届いたらすぐに例外だすので長さ1として扱う（どうせthrowするなら関係ないけど一応）</span>
            .<span style="color: #0600FF;">Do</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> Exception<span style="color: #000000;">&#40;</span>x.<span style="color: #0000FF;">EventType</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>; <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #0600FF;">return</span> received.<span style="color: #0000FF;">TakeUntil</span><span style="color: #000000;">&#40;</span>error<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// receivedが完了した時に同時にerrorをデタッチする必要があるのでMergeではダメ</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>成功例と失敗例を合成して一本のストリーム化。また、DataReceivedはそのままじゃデータすっからかんなので、Selectでbyte[]に変換してあげています。これで、ObserveReceiveBytes拡張メソッドを呼び出すだけで、かなり扱いやすい形になっている、と言えるでしょう。パフォーマンスも、これなら全く問題ありません。</p>

<h2>MolesとRx</h2>

<p>と、ドヤ顔しながら書いていたのですが、とーぜんセンサーの実物なんて持ってませんので動作確認しようにもできないし。ま、まあ、そういう時はモックとか用意して、ってSerialDataReceivedEventArgsはパブリックなコンストラクタないし、ああもうどうすればー。と、そこで出てくるのが<a href="http://research.microsoft.com/en-us/projects/moles/">Moles - Isolation framework</a>。以前に<a href="http://neue.cc/2011/03/10_309.html">Rx + MolesによるC#での次世代非同期モックテスト考察</a>という記事で紹介したのですが、めちゃくちゃ強力なモックライブラリです。パブリックなコンストラクタがないとか関係なくダミーのインスタンスを生成可能だし、センサーのイベントだから作り出せないし、なんてこともなく自由にダミーのイベントを発行しまくれます。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #000000;">&#91;</span>TestClass<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> SerialPortExtensionsTest <span style="color: #008000;">:</span> ReactiveTest
<span style="color: #000000;">&#123;</span>
    <span style="color: #000000;">&#91;</span>TestMethod, HostType<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Moles&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> ObserveReceiveBytesOnCompleted<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">// EventArgsを捏造！</span>
        <span style="color: #FF0000;">var</span> chars <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MSerialDataReceivedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> EventTypeGet <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> SerialData.<span style="color: #0000FF;">Chars</span> <span style="color: #000000;">&#125;</span>;
        <span style="color: #FF0000;">var</span> eof <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MSerialDataReceivedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> EventTypeGet <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> SerialData.<span style="color: #0000FF;">Eof</span> <span style="color: #000000;">&#125;</span>;
        <span style="color: #008080; font-style: italic;">// SerialPort::BytesToRead/SerialPort::Readで何もしない</span>
        MSerialPort.<span style="color: #0000FF;">AllInstances</span>.<span style="color: #0000FF;">BytesToReadGet</span> <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>self<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> 0;
        MSerialPort.<span style="color: #0000FF;">AllInstances</span>.<span style="color: #0000FF;">ReadByteArrayInt32Int32</span> <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>self, buffer, offset, count<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> 0;
&nbsp;
        <span style="color: #FF0000;">var</span> scheduler <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TestScheduler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 時間10, 20, 30, 40でSerialData.Charsのイベントを、時間50でEofのイベントを発行</span>
        MSerialPortExtensions.<span style="color: #0000FF;">DataReceivedAsObservableSerialPort</span> <span style="color: #008000;">=</span> _ <span style="color: #008000;">=&gt;</span> scheduler.<span style="color: #0000FF;">CreateHotObservable</span><span style="color: #000000;">&#40;</span>
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">20</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">30</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">40</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">50</span>, eof<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#40;</span>SerialDataReceivedEventArgs<span style="color: #000000;">&#41;</span>x<span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 走らせる(戻り値のbyte[]はどうでもいいので無視するためUnitに変換)</span>
        <span style="color: #FF0000;">var</span> result <span style="color: #008000;">=</span> scheduler.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> SerialPort<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ObserveReceiveBytes</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>_ <span style="color: #008000;">=&gt;</span> Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span>, 0, 0, <span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        result.<span style="color: #0000FF;">Messages</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span>
            OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span>,
            OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">20</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span>,
            OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">30</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span>,
            OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">40</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span>,
            OnCompleted<span style="color: #008000;">&lt;</span>Unit<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">50</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#91;</span>TestMethod, HostType<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Moles&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> ObserveReceiveBytesOnError<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">// EventArgsを捏造！</span>
        <span style="color: #FF0000;">var</span> chars <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MSerialDataReceivedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> EventTypeGet <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> SerialData.<span style="color: #0000FF;">Chars</span> <span style="color: #000000;">&#125;</span>;
        <span style="color: #FF0000;">var</span> eof <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MSerialDataReceivedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span> EventTypeGet <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> SerialData.<span style="color: #0000FF;">Eof</span> <span style="color: #000000;">&#125;</span>;
        <span style="color: #008080; font-style: italic;">// SerialPort::BytesToRead/SerialPort::Readで何もしない</span>
        MSerialPort.<span style="color: #0000FF;">AllInstances</span>.<span style="color: #0000FF;">BytesToReadGet</span> <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>self<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> 0;
        MSerialPort.<span style="color: #0000FF;">AllInstances</span>.<span style="color: #0000FF;">ReadByteArrayInt32Int32</span> <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>self, buffer, offset, count<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> 0;
&nbsp;
        <span style="color: #FF0000;">var</span> scheduler <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TestScheduler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 時間10, 20, 30, 40でSerialData.Charsのイベントを、時間50でEofのイベントを発行</span>
        MSerialPortExtensions.<span style="color: #0000FF;">DataReceivedAsObservableSerialPort</span> <span style="color: #008000;">=</span> _ <span style="color: #008000;">=&gt;</span> scheduler.<span style="color: #0000FF;">CreateHotObservable</span><span style="color: #000000;">&#40;</span>
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">20</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">30</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">40</span>, chars<span style="color: #000000;">&#41;</span>,
                OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">50</span>, eof<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#40;</span>SerialDataReceivedEventArgs<span style="color: #000000;">&#41;</span>x<span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">/* ↑までOnCompletedのものと共通 */</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// 時間35でErrorのイベントを発行</span>
        MSerialPortExtensions.<span style="color: #0000FF;">ErrorReceivedAsObservableSerialPort</span> <span style="color: #008000;">=</span> _ <span style="color: #008000;">=&gt;</span> scheduler.<span style="color: #0000FF;">CreateHotObservable</span><span style="color: #000000;">&#40;</span>
            OnNext<span style="color: #008000;">&lt;</span>SerialErrorReceivedEventArgs<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">35</span>, <span style="color: #008000;">new</span> MSerialErrorReceivedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 走らせる(戻り値のbyte[]はどうでもいいので無視するためUnitに変換)</span>
        <span style="color: #FF0000;">var</span> result <span style="color: #008000;">=</span> scheduler.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> SerialPort<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ObserveReceiveBytes</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>_ <span style="color: #008000;">=&gt;</span> Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span>, 0, 0, <span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// Exceptionの等値比較ができないので、バラしてAssertする</span>
        result.<span style="color: #0000FF;">Messages</span>.<span style="color: #0000FF;">Count</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        result.<span style="color: #0000FF;">Messages</span><span style="color: #000000;">&#91;</span>0<span style="color: #000000;">&#93;</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span>OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
        result.<span style="color: #0000FF;">Messages</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span>OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">20</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
        result.<span style="color: #0000FF;">Messages</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">2</span><span style="color: #000000;">&#93;</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span>OnNext<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">30</span>, Unit.<span style="color: #0600FF;">Default</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        result.<span style="color: #0000FF;">Messages</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">3</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Value</span>.<span style="color: #0000FF;">Kind</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span>NotificationKind.<span style="color: #0000FF;">OnError</span><span style="color: #000000;">&#41;</span>;
        result.<span style="color: #0000FF;">Messages</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">3</span><span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">Time</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">35</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>アサーションに使っているIsメソッドは、いつも通り<a href="http://chainingassertion.codeplex.com/">Chaining Assertion</a>です。</p>

<p>Molesがいくら強力だとは言っても、イベントをそのまま乗っ取るのはデリゲートの差し替えなどで、割と面倒だったりします。しかし、FromEventでラップしただけのIObservable&lt;T>を用意しておくと…… それを差し替えるだけで済むので超簡単になります。イベント発行については、TestScheduler(Rx-Testingを参照しておく)で、仮想時間で発行する値を作ってしまうと楽です。こういう、任意の時間で任意の値、というダミーの用意もFromEventでラップしただけのIObservable&lt;T>があると、非常に簡単になります。</p>

<p>あとは、scheduler.Startで走らせると(3つの引数はそれぞれcreated, subscribed, disposedの仮想時間、何も指定しないと…… 実は0始まり「ではない」ことに注意。100,200,1000がデフォなので、0はすっ飛ばされています)、その戻り値で結果を受け取って、Messagesに記録されているので、それにたいしてアサートメソッドをしかける。</p>

<p>実に簡単ですね！Molesの力とRxの力が組み合わさると、イベントのテストが恐ろしく簡単になります。素敵じゃないでしょうか？</p>

<h2>まとめ</h2>

<p>テストなしで書いてたコードは、Molesでテスト走らせたら間違ってました。TakeWhileの条件が==だったのと、Mergeで結合していたり……。はっはっは、ちゃんとユニットテストは書かないとダメですね！そして、Molesのお陰でちゃんと動作するコードが書けたので恥を欠かなくてすみました、やったね。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/12/21_360.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Modern C# Programming Style Guide</title>
		<link>http://neue.cc/2011/12/16_359.html</link>
		<comments>http://neue.cc/2011/12/16_359.html#comments</comments>
		<pubDate>Fri, 16 Dec 2011 14:22:02 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/12/16_359.html</guid>
		<description><![CDATA[C# Advent Calendar 2011、ということで、C# 4.0時代のプログラミングスタイルについて説明してみます。モダン、というけれど、某書のように変態的なことじゃなくて、むしろ基本的な話のほうです。こういったものはナマモノなので、5.0になればまた変わ]]></description>
			<content:encoded><![CDATA[<p><a href="http://atnd.org/events/21988">C# Advent Calendar 2011</a>、ということで、C# 4.0時代のプログラミングスタイルについて説明してみます。モダン、というけれど、某書のように変態的なことじゃなくて、むしろ基本的な話のほうです。こういったものはナマモノなので、5.0になればまた変わる、6.0になればまた変わる。変わります。古い話を間に受けすぎないこと(歴史を知るのは大事だけど、そのまま信じるのは別の話)、常に知識をリフレッシュするようにすること。そういうのが大事よね。でも、だからってモダンに書けなきゃダメ！なんてことはありません。ただ、知ること、少しずつ変えていくこと、そういうのは大事よね、って。</p>

<p>ところでしかし、私の主観がかなり入っているので、その辺は差っ引いてください。</p>

<h2>1. varを使う</h2>

<p>C# 3.0から搭載された型推論での宣言。出た当初には散々議論があって、今もたまに否の意見が出てきたりもしますが、varは使いましょう。積極的に。何にでも。国内的にも世界的にもMicrosoft的にも、var積極利用の方向で傾いているように見えます。また、最近流行りの関数型言語(Haskell, Scala, F#)は、少なくともC#のvarで可能な範囲は全て推論を使いますね←C#のvarはそれらに比べれば遥かに貧弱ですからね。そういったこともあるので、使わない理由もないでしょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> person <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">var</span> dict <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Dictionary<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span>, Tuple<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, Person<span style="color: #008000;">&gt;&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">var</span> query <span style="color: #008000;">=</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>varの利点は、何といっても書いていて楽なことです。はい、圧倒的に楽です。そして、型宣言の長さが一致するので「実は見やすい」というのもポイント高し。たった3文字の短さと相まって、ソースコードが綺麗になります。また、必ず変数の初期化を伴う、というのも良いことです。</p>

<p>欠点は「メソッドの戻り値などは宣言を見ても型が分からない」「インターフェイスで宣言できない」の二つが代表的でしょうか。前者は、Visual Studioを使えばマウスオーバーで型が表示されるので、コーディング上では支障はない。メールやBlogやWikiなど、Visual Studioのサポートのない完全にコードのみの状態だとサッパリなのは確かに難点ではありますが、逆にその程度の部分的な範囲なら、括り出されている目的が明確なわけなので、適切な変数名がついているのなら、正確な型名とまではいかずとも何に使うもののか大体分かるのではないでしょうか？なので、大きな問題だとは私は思いません。もし変数名がテキトーで型名ぐらいしかヒントが得られないんだよ！ということならば、varよりも前にまともな変数名をつけるようにしたほうがいいです。</p>

<p>インターフェイスで宣言できないことは、私は何の問題もないと思っています。具象型やメソッドの返す型でそのまま受けることに何の不都合が？むしろインターフェイスで宣言すると、アップキャスト可能という怪しい状態を作り出しているだけです。</p>

<p>ちなみにintやstring、配列などの基本的なものぐらいは型を書くという流儀もなくはないようですが、それは意味無いのでやめたほうがいいでしょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> num <span style="color: #008000;">=</span> <span style="color: #FF0000;">100</span>;
<span style="color: #FF0000;">var</span> text <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;hogehoge&quot;</span>;
<span style="color: #FF0000;">var</span> array <span style="color: #008000;">=</span> <span style="color: #008000;">new</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">2</span>, <span style="color: #FF0000;">3</span>, <span style="color: #FF0000;">4</span>, <span style="color: #FF0000;">5</span> <span style="color: #000000;">&#125;</span>;</pre></div></div>


<p>だって、こういうのこそ、見れば一発で分かるほど自明なので。</p>

<h2>2. オプション引数を使う(使いすぎない)</h2>

<p>害悪もあるわけですが、割と積極的に使ってもいいような気がします。実際Roslyn CTPなどでは結構派手に使われていますし、オーバーロード地獄よりはIntelliSense的にも分かりやすいかな、って。思います。enumなど使うと、明確に何が使われるか見えるんですね、これはとても嬉しくて。やっぱC#としてはIntelliSenseで分かりやすい、というのはとても大事かと。</p>

<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/csadvent_1.jpg">
</p>

<p>さて、分かりやすく使いすぎに注意な点としては、引数なしコンストラクタが消滅してしまう可能性があげられます。引数なしコンストラクタがないと、色々なところで弊害が起こります。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// こんなオプション引数なコンストラクタしかないクラスがあるとして</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ToaruClass
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> ToaruClass<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> defaultValue <span style="color: #008000;">=</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #FF0000;">class</span> Program
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">static</span> T <span style="color: #008000;">New</span><span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> where T <span style="color: #008000;">:</span> <span style="color: #008000;">new</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> <span style="color: #008000;">new</span> T<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #008080; font-style: italic;">// 使うときは引数なしでnewできるけど</span>
        <span style="color: #FF0000;">var</span> _ <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ToaruClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 実態は違うので、ジェネリックのnew制約が不可能になる</span>
        <span style="color: #008000;">New</span><span style="color: #008000;">&lt;</span>ToaruClass<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// コンパイル通らない</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// 引数なしコンストラクタを要求するシリアライザの利用も不可能に</span>
        <span style="color: #008000;">new</span> XmlSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>ToaruClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Serialize</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>シリアライズできなかったりジェネリックのnew制約がきかなくなってしまったり。ご利用は計画的に。シリアライズに関しては、DataContractSerializerならばコンストラクタを無視するので使えはしますが……。その辺の話は<a href="http://neue.cc/2011/12/10_357.html">neue cc - .NETの標準シリアライザ(XML/JSON)の使い分けまとめ</a>で。</p>

<p><a href="http://msdn.microsoft.com/ja-jp/roslyn">Roslyn CTP</a>のAPIはオプション引数が激しく使われているのですが、中でもこれは面白いと思いました。<a href="http://www.mindscapehq.com/blog/index.php/2011/10/20/in-bed-with-roslyn/">Mindscape Blog » Blog Archive » In bed with Roslyn</a>から引用します。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;">PropertyDeclarationSyntax newProperty <span style="color: #008000;">=</span> Syntax.<span style="color: #0000FF;">PropertyDeclaration</span><span style="color: #000000;">&#40;</span>
    modifiers<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">TokenList</span><span style="color: #000000;">&#40;</span>Syntax.<span style="color: #0000FF;">Token</span><span style="color: #000000;">&#40;</span>SyntaxKind.<span style="color: #0000FF;">PublicKeyword</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>,
    type<span style="color: #008000;">:</span> node.<span style="color: #0000FF;">Type</span>,
    identifier<span style="color: #008000;">:</span> node.<span style="color: #0000FF;">Identifier</span>,
    accessorList<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">AccessorList</span><span style="color: #000000;">&#40;</span>
        accessors<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">List</span><span style="color: #000000;">&#40;</span>
            Syntax.<span style="color: #0000FF;">AccessorDeclaration</span><span style="color: #000000;">&#40;</span>
                kind<span style="color: #008000;">:</span> SyntaxKind.<span style="color: #0000FF;">GetAccessorDeclaration</span>,
                bodyOpt<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">Block</span><span style="color: #000000;">&#40;</span>
                    statements<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">List</span><span style="color: #000000;">&#40;</span>
                        getter
                    <span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#41;</span>,
            Syntax.<span style="color: #0000FF;">AccessorDeclaration</span><span style="color: #000000;">&#40;</span>
                kind<span style="color: #008000;">:</span> SyntaxKind.<span style="color: #0000FF;">SetAccessorDeclaration</span>,
                bodyOpt<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">Block</span><span style="color: #000000;">&#40;</span>
                    statements<span style="color: #008000;">:</span> Syntax.<span style="color: #0000FF;">List</span><span style="color: #000000;">&#40;</span>
                        setter
                    <span style="color: #000000;">&#41;</span>
                <span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>そう、名前付き引数でツリー作ってるんですね。<a href="http://msdn.microsoft.com/ja-jp/library/bb387019.aspx">LINQ to XMLの関数型構築</a>も面白いやり方だと思いましたが、この名前付き引数を使った構築も、かなり素敵です。流行るかも！</p>

<h2>3. ジェネリックを使う</h2>

<p>もしお持ちの本がArrayListやHashTableを使っているコードが例示されていたら、窓から投げ捨てましょう。Silverlightでは廃止されていますし、WinRT(Windows 8)でも、勿論そんな産廃はありません。もはやどこにもそんなものを使う理由はありません。どうしても何でも入れられるListが欲しければ、List&lt;object>を使えばいいぢゃない。</p>

<h2>4. ジェネリックデリゲート(Func, Action)を使う</h2>

<p>これも賛否両論ではあるのですが、私は断然ジェネリックデリゲート派です。ちなみにその反対は野良デリゲート量産派でしょうか（悪意のある言い方！）。ジェネリックデリゲートを使うと良い点は、デリゲートの型違い（同じ引数・戻り値のデリゲートでも型が違うとキャストが必要）に悩まされなくてすむ、定義しなくていいので楽、そして、なにより分かりやすい。例えば、「MatchEvaluator」というだけじゃ、何なのかさっぱり分かりません。正規表現のReplaceで使われるデリゲートなのですけどね。Func&lt;Match, string>のほうが、ずっと分かりやすい。</p>

<p>では良くない点は、というと、引数に変数名で意味をつけられない。例えばLINQのSelectメソッドのFunc&lt;TSource, int, TResult>。このintはインデックスですが、そのことはドキュメントコメントからしか分かりません。その点、野良デリゲートを作れば</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">delegate</span> TR ConverterWithIndex<span style="color: #008000;">&lt;</span>T, TR<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>T value, <span style="color: #FF0000;">int</span> index<span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>という形で、明示できます。なんて素晴らしい？そう？実のところそんなでもなくて、これ、IntelliSenseからじゃあ分からないんですよね。</p>

<p class="noindent">
    <img src="http://neue.cc/wp-content/uploads/image/csadvent_2.jpg">
</p>

<p>F12なりなんなりで型定義まで飛ばないと見えないのです、デリゲートの変数名は。その点Func&lt;Match, string>なら引数の型、戻り値の型がIntelliSenseで見えるわけでして。C#的にはIntelliSenseで見えないと価値は9割減です。というわけで、天秤にかければ、圧倒的にFuncの大勝利。引数ずらずらでイミフになるならドキュメントコメントに書くことで補う、でもいいぢゃない。</p>

<p>ちなみにoutやrefのジェネリックデリゲートは存在しないので、その場合のみ自作デリゲートを立てる必要があります。それ以外、つまるところ99%ぐらいはFunc, Action, EventHandler&lt;T>でいいと思います。LINQだってPredicateじゃなくてFunc&lt;T, bool>だしね。</p>

<h2>5. ラムダ式を使う</h2>

<p>ラムダ式(C# 3.0)を使わなければ何を使うのって話ですが、ラムダ式の登場により割を食った匿名メソッド(C# 2.0)は産廃です。唯一の利点は、匿名メソッドは引数を使わない場合は省略して書けます。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 引数省略して書けるぞ！</span>
button.<span style="color: #0000FF;">Click</span> <span style="color: #008000;">+=</span> <span style="color: #FF0000;">delegate</span> <span style="color: #000000;">&#123;</span> MessageBox.<span style="color: #0000FF;">Show</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;hoge&quot;</span><span style="color: #000000;">&#41;</span>; <span style="color: #000000;">&#125;</span>;
<span style="color: #008080; font-style: italic;">// ラムダ式の場合は省略できないんだ(棒)</span>
button.<span style="color: #0000FF;">Click</span> <span style="color: #008000;">+=</span> <span style="color: #000000;">&#40;</span>_, __<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> MessageBox.<span style="color: #0000FF;">Show</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;hoge&quot;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>こんなことは実にどうでもいいので、匿名メソッドを使うのはやめましょう。もしラムダ式が先にあれば、匿名メソッドはなかったと思います。ジェネリックが最初からあれば非ジェネリックコレクションクラスがなかっただろう、ということな程度には。あとジェネリックが先にあれば野良デリゲートもなかった気がする。なので、多少どうでもいい利点があったとしても、素直に使わないのが一番。</p>

<p>ところでラムダ式の引数の名前ですが、どうしていますか？私は、昔は型名から取っていました、例えばintだったらi、stringだったらs。でも最近は全てxにしています。理由は、面倒くさいし適切な名前が出てこない場合もあるし修正漏れが起こったりする（ハンガリアンみたいなもんですしねえ）などなどで、メリットを感じなかったので。</p>

<p>ちなみに、ラムダ式で長い名前を使うのは反対です。「名前はしっかりつけなきゃダメ！」が原則論のはずなのにxってなんだよそれって感じですが、逆に、小さい範囲のものは小さいほうがいいのです。名前をつけないことで、他の名前のついているものを強調します。なんでもかんでも名前をつけていると五月蝿くて、木を森に隠す、のようになってしまいます。LINQやRxでラムダ式だらけになると、なおそうです。勿論、ラムダ式だからって全てxにするわけではありません。中でネストしてネスト内でも使われたり、式ではなく文になってスコープが長くなっている場合などは、ちゃんと名前をつけます。また、（分かりやすさのため）強く意味を持たせたい場合も名前をつけます。型名以上の意味を持たせられないのなら、あえて名前をつける必要性を感じないのでxです。</p>

<p>そういうわけで、多少崩すこともありますが、原則的に私の命名規則は「ただの変数 = x, 配列などコレクション = xs, 引数を使わない = アンダースコア」としています。xのかわりにアンダースコアを使う流儀もあるようですが、私は嫌いですね……。Scalaのアンダースコアとは意味が違う感じもあるし、同じ.NETファミリーならばF#が引数を使わないという意味でアンダースコアを使っているので、それに合わせたほうがいいと思っています。xだと座標のxと被る、という場合は座標のxにつける変数名をpointXだかpxだかに変えます。</p>

<p>Exceptionはexにしたり、イベントの場合は(sender, e)にしたりはしますけれど、このへんは慣習ですし、わざわざ崩すほうが変かな。あとLINQでのGroupingはgを使ったりしますね。</p>

<h2>6.  LINQを使う（主にメソッド構文を使う、クエリ構文もたまには使う）</h2>

<p>LINQはデータベースのためだけじゃなく、むしろ通常のコレクションへの適用(LINQ to Objects)のほうが多い。そんなにコレクション操作することなんてない、わけがない、はず。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 配列の中のYから始まるものの名前(スペースできった最後のもの)を取り出す</span>
<span style="color: #008000;">new</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #666666;">&quot;Yamada Tarou&quot;</span>, <span style="color: #666666;">&quot;Yamamoto Jirou&quot;</span>, <span style="color: #666666;">&quot;Suzuki Saburou&quot;</span> <span style="color: #000000;">&#125;</span>
    .<span style="color: #0000FF;">Where</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">StartsWith</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Y&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Split</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">' '</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Last</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>上の例のような、Where（フィルタリング）+ Select（射影）は特に良く使うパターンです。Pythonなどでもリスト内包表記としてパッケージされるぐらいには。やはり、この手の処理を持っていないと、重苦しい。しかし、C# 3.0はLINQを手にしたので、お陰で軽快に飛び回れるようになりました。しかもただのフィルタ＋射影だけではなく、ありとあらゆる汎用コレクション処理を、チェーンで組み合わせることで、無限のパターンを手にしました。</p>

<p>LINQにはメソッド構文とクエリ構文があり、どちらも同じですがメソッド構文のほうが機能豊富だし、分かりやすいです。なのでメソッド構文でメソッドチェーンﾊｧﾊｧしましょう。<a href="http://linqjs.codeplex.com/">linq.js - LINQ for JavaScript</a>で同様の記法でJavaScriptでも使えますし！</p>

<p>じゃあクエリ構文に利点はないのかというと当然そんなことはなく、多重from(SelectManyに変換される)が多く出現する場合はクエリ構文のほうがいいですね。また、Joinなどもクエリ構文のほうが書きやすいし、GroupJoinと合わせた左外部結合を記述したりなど複雑化する場合はクエリ構文じゃないと手に負えません（書けなくはないんですけどねえ）</p>

<p>それと、LINQ to SQLなどExpression Treeをそれぞれの独自プロパイダが解釈するタイプのものは、メソッド構文の豊富な記述可能性が逆に、プロパイダの解釈不能外に飛び出しがちなので、適度に制約の効いたクエリ構文だけで書いたほうがスムーズにいく可能性があります。</p>

<p>また、XMLはC#ではXmlReader/Writer, XmlDocument(DOM), XDocument(LINQ to XML)がありますが、そのうちDOMのXmlDocumentは産廃です。DOMって使いづらいのよね、それにSilverlightにはないし。メモリ内にツリーを持つタイプではXDocument(XElement)でLINQでﾊｧﾊｧするのが主流です。ちなみにXmlReader/Writerはストリーミング型なので別枠、ただ、生で使うことはあまりないと思います。特にWriterは、<a href="http://msdn.microsoft.com/ja-jp/library/system.xml.linq.xstreamingelement.aspx">XStreamingElement</a>を使えば省メモリなストリーミングで、Writeできる、しかもずっと簡単に。なので、使うことはないかと思います。</p>

<h2>7. Taskを使う(生スレッドを使わない)</h2>

<p>マルチスレッドプログラミングしなきゃ！Threadを使おう？デリゲートのBeginInvokeがある？それともThreadPool？BackgroundWorkerもあるぞ！古い記事はこれらの使用方法が解説されてきました。そうです、今まではそれらしかなかったので。けれど、全部ゴミ箱に投げ捨てましょう。.NET 4.0からは基本的原則的にTaskを使うべきです。豊富な待ち合わせ処理・継続・例外処理・キャンセルなどをサポートしつつ、同じスレッドを使いまわそうとするなど実行効率も配慮されています。もはや生スレッドを使う理由はないし、デリゲートのBeginInvokeなどともさよなら。BackgroundWorkerは、もう少しは出番あるかも(UIへの通知周りが今のTaskだけだと少し面倒、RxやC# 5.0のAsyncなら簡単にこなせるのですが)。</p>

<p>CPUを使う処理を並列に実行をしたいのなら、PLINQやParallel.ForEachなどが手軽かつ超強力です。</p>

<p>また、C# 5.0からはTaskの言語サポートが入り、awaitキーワードによりコード上では待機したように見せかけ同期的のように書けつつ中身は非同期で動く、といったことが可能になります。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">async</span> Task<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> GetBingHtml<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">var</span> wc <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> WebClient<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #FF0000;">var</span> html <span style="color: #008000;">=</span> <span style="color: #FF0000;">await</span> wc.<span style="color: #0000FF;">DownloadStringTaskAsync</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> Uri<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;http://bing.com/&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">return</span> html;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>awaitするだけで同期的のように非同期が書けるなんて魔法のよう！</p>

<p>また、非同期といっても二つあります。CPUを沢山使って重たい処理と、I/O待ち（ネットワークやファイルアクセス）が重たい処理。これらへの対処は、別です。I/O待ちにスレッドを立てて対処することも可能ではありますが、あまり褒められた話ではありません。と、C#たんが<a href="http://csharptan.wordpress.com/2011/12/10/%e9%9d%9e%e5%90%8c%e6%9c%9fio%e5%be%85%e3%81%a1/">非同期I/O待ち</a>で言ってました。非同期I/Oは優れているのは分かったとしても、記述が面倒なのがネックだったのですね。しかし、C# 5.0からならばawaitが入るのでかなりサクッと書ける。非同期だって、node.jsにばかりは負けてられない！</p>

<p>なお、現在SilverlightやWindows Phone 7にはTaskがない(Silverlight 5にはTask入りました)ですが、将来的には間違いなく入るので、期待して待ちましょう。そして、分かりやすく書けるC# 5.0もwktkして待ちましょう。待ちきればければ<a href="http://msdn.microsoft.com/en-us/vstudio/gg316360">Async CTP</a>として公開されているので、試すことが可能です。</p>

<h2>8. Rxを使う</h2>

<p>C# 5.0はCTPだし、現実問題として非同期に困ってるんだよ！という場合は、変化球としてReactive Extensionsが使えます。詳しくは<a href="http://www.atmarkit.co.jp/fdotnet/introrx/index/index.html">Reactive Extensions（Rx）入門 － ＠IT</a>で連載しているので読んでね！第二回がいつまでたっても始まらないのは何故なのでしょう、はい、私が原稿を送っていないからです、ごめんなさい……。これ書いてないで原稿書けやｺﾞﾙｧという感じですはい。いえ、もうすぐもう少しなので、ちょっと待ってください。</p>

<p>RxはTaskとは全く別の次元からやってきつつ、機能的にはある程度代替可能です。C# 5.0が来た時に共存できるのか、というと、非同期面ではTaskに譲るでしょう。けれど、非同期の生成をTaskで行なって、コントロールをawaitも使いつつRxでメインに使うとかも可能です。基本的に、コントロール周りはawaitサポートを除けばRxのほうが強力で柔軟です(代償として効率を若干犠牲にしているけれど)。ただまあ、基本的には非同期処理はTaskに絞られていくだろうと考えています。少し寂しいけど、全体としてより美しく書けるなら全然いいです、むしろ大歓迎なので早くC#5.0来ないかなあ。</p>

<p>ちなみに、Rxは別に非同期のためだけじゃなくて、イベントと、そしてあらゆるソースを合成するという点も見逃せないわけなので、決してAsync来たからRxさようなら、ではないです。その辺のことも連載であうあう。</p>

<h2>9. Expressionを使う(そしてEmitしない)</h2>

<p>Expressionの簡単な基本ですが、Expressionとして宣言します。Funcとほとんど同じで、違うのは型宣言だけです。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 同じラムダ式だけれど</span>
Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, <span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;&gt;</span> expr <span style="color: #008000;">=</span> x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> x;
Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, <span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> func <span style="color: #008000;">=</span> x <span style="color: #008000;">=&gt;</span> x <span style="color: #008000;">*</span> x;
&nbsp;
<span style="color: #008080; font-style: italic;">// Expressionで宣言すると実態は以下のものになる(コンパイラが自動生成する)</span>
<span style="color: #FF0000;">var</span> paramX <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Parameter</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;x&quot;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">var</span> expr <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Lambda</span><span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span>, <span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;&gt;</span><span style="color: #000000;">&#40;</span>
    Expression.<span style="color: #0000FF;">Multiply</span><span style="color: #000000;">&#40;</span>paramX, paramX<span style="color: #000000;">&#41;</span>,
    <span style="color: #008000;">new</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> paramX <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>Expressionで宣言するとコンパイラがコンパイル時に式木生成コードに変換してくれるのですね。自分で宣言しなくても、メソッドの引数の型がExpressionならば同じです。例えばQueryable.SelectのselectorはExpression型の引数なので、Queryableで連鎖を書いているということは同様に↑のようなコードが吐かれています。</p>

<p>Expressionの仕事は色々ありますが、概ね二つ。式がデータとして取り出せること。簡単な所ではINotifyPropertyChangedの実装なので話題沸騰したりしなかったりした、文字列ではなくプロパティを渡して、そこから引数名を取り出すことができること。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> MyClass
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> MyProperty <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// これ</span>
<span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> <span style="color: #FF0000;">string</span> GetPropertyName<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>Expression<span style="color: #008000;">&lt;</span>Func<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;&gt;</span> propertyExpression<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">return</span> <span style="color: #000000;">&#40;</span>propertyExpression.<span style="color: #0000FF;">Body</span> <span style="color: #0600FF;">as</span> MemberExpression<span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Member</span>.<span style="color: #0000FF;">Name</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">var</span> mc <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MyClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #FF0000;">var</span> propName <span style="color: #008000;">=</span> GetPropertyName<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> mc.<span style="color: #0000FF;">MyProperty</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>こんな形で推し進めたのが、LINQ to SQLなど、式木の塊を解釈してSQLに変換するといった、QueryProviderですね。</p>

<p>そしてもう一つはILビルダー。式木はCompileすることでFuncに変換することが可能です。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// (object target, object value) =&gt; ((T)target).memberName = (U)value</span>
<span style="color: #0600FF;">static</span> Action<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">object</span>, <span style="color: #FF0000;">object</span><span style="color: #008000;">&gt;</span> CreateSetDelegate<span style="color: #000000;">&#40;</span>Type type, <span style="color: #FF0000;">string</span> memberName<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">var</span> target <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Parameter</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;target&quot;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Parameter</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span><span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;value&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #FF0000;">var</span> left <span style="color: #008000;">=</span>
        Expression.<span style="color: #0000FF;">PropertyOrField</span><span style="color: #000000;">&#40;</span>
            Expression.<span style="color: #0000FF;">Convert</span><span style="color: #000000;">&#40;</span>target, type<span style="color: #000000;">&#41;</span>, memberName<span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #FF0000;">var</span> right <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Convert</span><span style="color: #000000;">&#40;</span>value, left.<span style="color: #0000FF;">Type</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #FF0000;">var</span> lambda <span style="color: #008000;">=</span> Expression.<span style="color: #0000FF;">Lambda</span><span style="color: #008000;">&lt;</span>Action<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">object</span>, <span style="color: #FF0000;">object</span><span style="color: #008000;">&gt;&gt;</span><span style="color: #000000;">&#40;</span>
        Expression.<span style="color: #0000FF;">Assign</span><span style="color: #000000;">&#40;</span>left, right<span style="color: #000000;">&#41;</span>,
        target, value<span style="color: #000000;">&#41;</span>;
&nbsp;
    <span style="color: #0600FF;">return</span> lambda.<span style="color: #0000FF;">Compile</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Test</span>
<span style="color: #0600FF;">static</span> <span style="color: #0600FF;">void</span> Main<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> args<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">var</span> target <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MyClass <span style="color: #000000;">&#123;</span> MyProperty <span style="color: #008000;">=</span> <span style="color: #FF0000;">200</span> <span style="color: #000000;">&#125;</span>;
    <span style="color: #FF0000;">var</span> accessor <span style="color: #008000;">=</span> CreateSetDelegate<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>MyClass<span style="color: #000000;">&#41;</span>, <span style="color: #666666;">&quot;MyProperty&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
    accessor<span style="color: #000000;">&#40;</span>target, <span style="color: #FF0000;">1000</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// set</span>
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>target.<span style="color: #0000FF;">MyProperty</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 1000</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>少なくとも、自前でILを書くよりは圧倒的に簡単に、動的コード生成を可能にしました。動的コード生成はCompileは重いものの、一度生成したデリゲートをキャッシュすることで二度目以降は超高速になります。単純なリフレクションよりはずっと速く。といったようなことを<a href="http://neue.cc/2011/04/20_317.html">neue cc - Expression Treeのこね方・入門編 - 動的にデリゲートを生成してリフレクションを高速化</a>で書いたので読んでね！</p>

<h2>10. dynamicを使わない（部分的に使う）</h2>

<p>一時期、LLブームで動的言語が持て囃されましたが、今は（静的型付けの）関数型言語ブームで、静的型付けへ寄り戻しが来ています。なので、C#もdynamicあって動的だよねひゃっほーい、なんてことはなく、むしろvarで型推論です(ｷﾘｯ のほうが正しくて。そんなわけで、dynamicはあまり使いません。ですが、使うとより素敵な場所も幾つかあります。それは、本質的に動的なところに対して。動的なのってどこ？というと、アプリケーションの管理範囲外。</p>

<p>例えばJSONはスキーマレス。DBも、自動生成しなければアプリケーションの外側で見えない。.NETはDLRがあるのでIronPythonなどスクリプト言語との連携などもそう。<a href="http://dynamicjson.codeplex.com/">DynamicJson</a>を例にだすと、スキーマレスなJSONに対して、そのまま、JSONをJavaScriptで扱うのと同じように使えます。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> json <span style="color: #008000;">=</span> DynamicJson.<span style="color: #0000FF;">Parse</span><span style="color: #000000;">&#40;</span><span style="">@&quot;{&quot;</span><span style="color: #666666;">&quot;foo&quot;</span><span style="color: #666666;">&quot;:&quot;</span><span style="color: #666666;">&quot;json&quot;</span><span style="color: #666666;">&quot;, &quot;</span><span style="color: #666666;">&quot;bar&quot;</span><span style="color: #666666;">&quot;:100, &quot;</span><span style="color: #666666;">&quot;nest&quot;</span><span style="color: #666666;">&quot;:{ &quot;</span><span style="color: #666666;">&quot;foobar&quot;</span><span style="color: #666666;">&quot;:true } }&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> r1 <span style="color: #008000;">=</span> json.<span style="color: #0000FF;">foo</span>; <span style="color: #008080; font-style: italic;">// &quot;json&quot; - dynamic(string)</span>
<span style="color: #FF0000;">var</span> r2 <span style="color: #008000;">=</span> json.<span style="color: #0000FF;">bar</span>; <span style="color: #008080; font-style: italic;">// 100 - dynamic(double)</span>
<span style="color: #FF0000;">var</span> r3 <span style="color: #008000;">=</span> json.<span style="color: #0000FF;">nest</span>.<span style="color: #0000FF;">foobar</span>; <span style="color: #008080; font-style: italic;">// true - dynamic(bool)</span></pre></div></div>


<p>また、動的な存在であるDBへのIDataRecordも、<a href="http://dbexecutor.codeplex.com/">DbExecutor</a>を例に出すと</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> products <span style="color: #008000;">=</span> DbExecutor.<span style="color: #0000FF;">ExecuteReaderDynamic</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> SqlConnection<span style="color: #000000;">&#40;</span>connStr<span style="color: #000000;">&#41;</span>, <span style="">@&quot;
        select ProductName, QuantityPerUnit from Products
        where SupplierID = @SupplierID and UnitPrice &gt; @UnitPrice
        &quot;</span>, <span style="color: #008000;">new</span> <span style="color: #000000;">&#123;</span> SupplierID <span style="color: #008000;">=</span> <span style="color: #FF0000;">1</span>, UnitPrice <span style="color: #008000;">=</span> <span style="color: #FF0000;">10</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>d <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> Product
    <span style="color: #000000;">&#123;</span>
        ProductName <span style="color: #008000;">=</span> d.<span style="color: #0000FF;">ProductName</span>,
        QuantityPerUnit <span style="color: #008000;">=</span> d.<span style="color: #0000FF;">QuantityPerUnit</span>
    <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>ドットで自然に参照可能なことと、また、dynamicが自動でキャストしてくれるので明示的なキャストが不要なため、取り回しの面倒な手動DBアクセスが随分と簡単になります。（が、DBのアクセス結果を決まったクラスにマッピングするのなら、9で紹介している動的コード生成でアクセサを作ったほうが更に楽々になるのでそこまで出番はないかも。DbExecutorは両方を搭載しているので、必要に応じて選ぶことが可能です）</p>

<h2>11. 自動プロパティを使う</h2>

<p>自動プロパティ vs パブリックフィールド。同じです。はい、同じです。じゃあパブリックフィールドでいいぢゃん？という話が度々ありますが、いえ、そんなことはありません。プロパティにするとカプセル化が云々、変更した場合に云々、などは割とどうでもいいのですが、重要な違いはちゃんとあります。</p>

<p>WPFとかASP.NETとかのバインディングがプロパティ大前提だったりしてパブリックフィールドだと動かないことがある。</p>

<p>なので、黙って自動プロパティにしておきましょう。それに関連してですが、リフレクションでの扱い易さがプロパティとフィールドでは全然違って、プロパティだと断然楽だったりします。そういう面でサードパーティのライブラリでも、プロパティだけをサポート、なものも割とあるのではかと思います。具体例はあげられませんが私は自分で作るちょろっとリフレクションもにょもにょ系の小粒なライブラリは面倒なのでプロパティだけサポート、にすることが結構あります。</p>

<p>あと自動プロパティの定義はコードスニペットを使って一行でやりましょう。prop->Tab->Tabです。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> MyProperty <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span></pre></div></div>


<p>get, setで改行して5行使ったりするのはコードの可読性が落ちるので、好きじゃありません。コードスニペットで一行のものが生成されるわけなので、それに従うという意味でも、一行で書くのがベストと思います。</p>

<h2>まとめ</h2>

<p>C#は言語がちゃんと進化を続けてきた。進化って無用な複雑化！ではなくて、基本的には今までよくなかった、やりづらいことを改善するために進化するんですよね。だから、素直にその良さを甘受したい。そしてまた、進化するということは、歴史の都合上で廃棄物が出てきてしまうというのもまた隣合わせ。C#は巧妙に、多量の廃棄物が出現するのを避けてきていると思います。ヘジたんの手腕が光ります。しかし、やはりどうしても幾つかの廃棄物に関しては致し方ないところです。それに関しては、ノウハウとして、自分で避けるしかなくて。</p>

<p>この手の話だったら、.NETのクラスライブラリ設計が良いです。もしお持ちでなければ、今すぐ買いましょう！いますぐ！超おすすめです。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=ilsgeometrati-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=ss_til&#038;asins=4891006765" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>また、この手の本だったらEffective C# 4.0もかしら。第一版は（翻訳が出たのが既にC# 4.0の頃で1.0の内容）古くてう～ん、といった感だったのですが、第二版(C# 4.0対応)はかなり良かったです。More Effective C#のほうはLINQ前夜といった感じの内容で若干微妙なのですが、LINQ的な考えが必要な理由を抑える、という点では悪くないかもしれません。また、決定版的な内容を求めるならば、読み通す必要はなく気になるところつまみ読みで良いので、プログラミング.NET Frameworkがお薦めです。</p>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=ilsgeometrati-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=ss_til&#038;asins=4798122513" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<iframe src="http://rcm-jp.amazon.co.jp/e/cm?lt1=_blank&#038;bc1=000000&#038;IS2=1&#038;bg1=FFFFFF&#038;fc1=000000&#038;lc1=0000FF&#038;t=ilsgeometrati-22&#038;o=9&#038;p=8&#038;l=as4&#038;m=amazon&#038;f=ifr&#038;ref=ss_til&#038;asins=4822294161" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>これらに加えて、自分のやりたいことの対象フレームワークの本(ASP.NET/ASP.NET MVC/Win Forms/WPF/WCF/Silverlight/Windows Phone 7/Unity)を一冊用意すれば、導入としては準備万端で素敵ではないかしらん。まあ、今時フレームワークとかの先端の部分だと、フレームワークの進化の速度が速すぎて本だと情報の鮮度が落ちる(特に日本だと)ので、基本は本でサッと抑えて、深い部分はネットの記事を見たほうが良いのではかと思います。ソースコードが公開されていたりフレームワークの制作陣や第一人者が情報出していたりしますしね。本こそが情報の基本にして全て、という時代でもないのだなぁ、と。学習の仕方というのも、時代で変わっていくものだと思います。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/12/16_359.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>

