<?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>Tue, 17 Jan 2012 14:54:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.3</generator>
	<language>en</language>
			<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>
		<item>
		<title>Voidインスタンスの作り方、或いはシリアライザとコンストラクタについて</title>
		<link>http://neue.cc/2011/12/13_358.html</link>
		<comments>http://neue.cc/2011/12/13_358.html#comments</comments>
		<pubDate>Tue, 13 Dec 2011 11:53:57 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/12/13_358.html</guid>
		<description><![CDATA[voidといったら、特別扱いされる構造体です。default(void)なんてない。インスタンスは絶対作れない。作れない。本当に？


var v = System.Runtime.Serialization.FormatterServices.GetUninitializedObject&#40;typeof&#40;void&#41;&#41;;
&#160;
Console.WriteLine&#40;v&#41;; // System.Void


作れました。というわけで、GetUninitializedObjectはその名前のとおり、コンストラクタをスルーしてオブジェクトを生成]]></description>
			<content:encoded><![CDATA[<p>voidといったら、特別扱いされる構造体です。default(void)なんてない。インスタンスは絶対作れない。作れない。本当に？</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> v <span style="color: #008000;">=</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Runtime</span>.<span style="color: #0000FF;">Serialization</span></span>.<span style="color: #0000FF;">FormatterServices</span>.<span style="color: #0000FF;">GetUninitializedObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">void</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>v<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// System.Void</span></pre></div></div>


<p>作れました。というわけで、GetUninitializedObjectはその名前のとおり、コンストラクタをスルーしてオブジェクトを生成します。そのため、voidですら生成できてしまうわけです、恐ろしい。こないだ<a href="http://neue.cc/2011/12/10_357.html">.NETの標準シリアライザ(XML/JSON)の使い分けまとめ</a>という記事でシリアライザ特集をして少し触れましたが、DataContractSerializerで激しく使われています。よって、シリアライズ対象のクラスがコンストラクタ内で激しく色々なところで作用しているようならば、それが呼び出されることはないので注意が必要です。</p>

<p>ただし、DataContractSerializerを使ったからって、必ずしも呼ばれるわけではないです。DataContract属性がついていなければ普通にコンストラクタを呼ぶ。DataContract属性がついていれば、引数のないコンストラクタがあったとしても、コンストラクタを無視する。という挙動になっているようです。ちょっと紛らわしいので、以下のコードは（参照設定があれば）そのままペーストして動くので、是非試してみてください。</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.Expressions</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Runtime.Serialization</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Runtime.Serialization.Json</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text</span>;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Xml.Serialization</span>;
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> EmptyClass
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> EmptyClass<span style="color: #000000;">&#40;</span><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><span style="color: #666666;">&quot;BANG!&quot;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#91;</span>DataContract<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ContractEmptyClass
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> ContractEmptyClass<span style="color: #000000;">&#40;</span><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><span style="color: #666666;">&quot;BANG!BANG!&quot;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#91;</span>DataContract<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> NoEmptyConstructorClass
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> NoEmptyConstructorClass<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> dummy<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><span style="color: #666666;">&quot;BANG!BANG!BANG!&quot;</span><span style="color: #000000;">&#41;</span>;
    <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> <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するとBANG!</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;New:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> EmptyClass<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// Activator.CreateInstanceでnewするのもBANG!</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Activator.CreateInstance:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e2 <span style="color: #008000;">=</span> Activator.<span style="color: #0000FF;">CreateInstance</span><span style="color: #008000;">&lt;</span>EmptyClass<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// ExpressionTreeでCompileしてもBANG!</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Expression.New&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e3 <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>EmptyClass<span style="color: #008000;">&gt;&gt;</span><span style="color: #000000;">&#40;</span>Expression.<span style="color: #008000;">New</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>EmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Compile</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Invoke</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 何も起こらない（コンストラクタを無視するのでね）</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;GetUninitializedObject:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e4 <span style="color: #008000;">=</span> <span style="color: #000000;">System.<span style="color: #0000FF;">Runtime</span>.<span style="color: #0000FF;">Serialization</span></span>.<span style="color: #0000FF;">FormatterServices</span>.<span style="color: #0000FF;">GetUninitializedObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>EmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// XmlSerializerでのデシリアライズはBANG!</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;XmlSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e5 <span style="color: #008000;">=</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>EmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&lt;EmptyClass /&gt;&quot;</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;">// DataContractSerializerでもBANGって起こるよ！</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;DataContractSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e6 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>EmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&lt;EmptyClass xmlns=<span style="color: #008080; font-weight: bold;">\&quot;</span>http://schemas.datacontract.org/2004/07/<span style="color: #008080; font-weight: bold;">\&quot;</span> /&gt;&quot;</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;">// DataContractJsonSerializerでも起こるんだ！</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;DataContractJsonSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e7 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractJsonSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>EmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{}&quot;</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;">// DataContract属性をつけたクラスだと何も起こらない</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;DataContract + DataContractSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e8 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>ContractEmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&lt;ContractEmptyClass xmlns=<span style="color: #008080; font-weight: bold;">\&quot;</span>http://schemas.datacontract.org/2004/07/<span style="color: #008080; font-weight: bold;">\&quot;</span> /&gt;&quot;</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;">// DataContract属性をつけたクラスだとJsonSerializerのほうも当然何も起こらない</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;DataContract + DataContractJsonSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e9 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractJsonSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>ContractEmptyClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{}&quot;</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;">// 空コンストラクタのないもの+DataContractSerializerだと何も起こらない</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;NoEmptyConstructor + DataContractSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e10 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>NoEmptyConstructorClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;&lt;NoEmptyConstructorClass xmlns=<span style="color: #008080; font-weight: bold;">\&quot;</span>http://schemas.datacontract.org/2004/07/<span style="color: #008080; font-weight: bold;">\&quot;</span> /&gt;&quot;</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;">// 空コンストラクタのないもの+DataContractJsonSerializerでも何も起こらない</span>
        Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;NoEmptyConstructor + DataContractJsonSerializer:&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> e11 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractJsonSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>NoEmptyConstructorClass<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;{}&quot;</span><span style="color: #000000;">&#41;</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></pre></div></div>


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

<p>.NET 4でもSilverlightでも共通です。この挙動は妥当だと思います。DataContract属性を付けた時点で、そのクラスはシリアライズに関して特別な意識を持つ必要がある。コンストラクタ内でシリアライズで復元できない副作用のある処理をすべきではない。逆に、何も付いていない場合は特に意識しなくても大丈夫。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/12/13_358.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>.NETの標準シリアライザ(XML/JSON)の使い分けまとめ</title>
		<link>http://neue.cc/2011/12/10_357.html</link>
		<comments>http://neue.cc/2011/12/10_357.html#comments</comments>
		<pubDate>Sat, 10 Dec 2011 12:50:17 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

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

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

		<guid isPermaLink="false">http://neue.cc/2011/12/10_357.html</guid>
		<description><![CDATA[今年もAdvent Calendarの季節がやってきましたね。去年は私はC#とJavaScriptで書きましたが、今年はC#とSilverlightでやります。というわけで、この記事はSilverlight Advent Calendar 2011用のエントリです。前日は@posauneさんのSilverlightのListBoxでつくるいんちきHorizontalTextBlock でした。

今回の記事中のサンプルはSilverlight 4で書いています]]></description>
			<content:encoded><![CDATA[<p>今年もAdvent Calendarの季節がやってきましたね。去年は私はC#とJavaScriptで書きましたが、今年はC#とSilverlightでやります。というわけで、この記事は<a href="http://atnd.org/events/22001">Silverlight Advent Calendar 2011</a>用のエントリです。前日は<a href="https://twitter.com/#!/Posaune">@posaune</a>さんの<a href="http://d.hatena.ne.jp/posaunehm/20111209/1323443047">SilverlightのListBoxでつくるいんちきHorizontalTextBlock </a>でした。</p>

<p>今回の記事中のサンプルはSilverlight 4で書いています。が、Silverlight用という体裁を持つためにDebug.WriteLineで書いているというだけで、Silverlightらしさは皆無です！えー。.NET 4でもWindows Phone 7でも関係なく通じる話ですねん。</p>

<h2>シリアライザを使う場面</h2>

<p>概ね3つではないでしょうか。外部で公開されているデータ(APIをネット経由で叩くとか)をクラスに変換する。これは 自分の管理外→プログラム での片方向です。内部で持っているデータ(クラスのインスタンス)を保存用・復元用に相互変換する。これは プログラム←→自分の管理内 での双方向です。最後に、内部で持っているデータを公開用に変換する。これは プログラム→外部 での片方向。</p>

<p>目的に応じてベストな選択は変わってきます。こっから延々と長ったらしいので、まず先に結論のほうを。</p>

<ul>
<li>外部APIを叩く→XML/XmlSerializer, JSON/DataContractJsonSerializer</li>
<li>オブジェクトの保存・復元用→DataContractSerializer</li>
<li>外部公開→さあ？</li>
</ul>

<p>外部公開のは、Silverlightの話じゃないので今回はスルーだ！<a href="http://msdn.microsoft.com/ja-jp/library/system.xml.linq.xstreamingelement.aspx">XStreamingElement</a>で組み上げてもいいし、何でもいいよ！WCFのテンプレにでも従えばいいんぢゃないでしょーか。</p>

<h2>XmlSerializer</h2>

<p>古くからあるので、シリアライザといったらこれ！という印象な方も多いのではないでしょうか。その名の通り、素直にXMLの相互変換をしてくれます。</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: #008080; font-style: italic;">// (以降、断り書きなくPersonが出てきたらこいつを使ってると思ってください)</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Age <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</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;">// データ準備</span>
<span style="color: #FF0000;">var</span> data <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;山本山&quot;</span>, Age <span style="color: #008000;">=</span> <span style="color: #FF0000;">99</span> <span style="color: #000000;">&#125;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</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>Person<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> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    serializer.<span style="color: #0000FF;">Serialize</span><span style="color: #000000;">&#40;</span>ms, data<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: #FF0000;">var</span> xml <span style="color: #008000;">=</span> Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>ms.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, 0, <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>ms.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</span>;
&nbsp;
    ms.<span style="color: #0000FF;">Position</span> <span style="color: #008000;">=</span> 0; <span style="color: #008080; font-style: italic;">// 巻き戻して……</span>
    <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// デシリアライズ</span>
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 山本山:99</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;">// 出力結果のXML
﻿<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Person</span> <span style="color: #000066;">xmlns:xsi</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span style="color: #000066;">xmlns:xsd</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>山本山<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>99<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>素直な使い勝手、素直な出力。いいですね。さて、しかし特に外部APIを叩いて手に入るXMLは名前PascalCaseじゃねーよ、とか属性の場合どうすんだよ、という場合も多いでしょう。細かい制御にはXmlAttributeを使います。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #000000;">&#91;</span>XmlRoot<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;people&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> People
<span style="color: #000000;">&#123;</span>
    <span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;count&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Count <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#91;</span>XmlArray<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;persons&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #000000;">&#91;</span>XmlArrayItem<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;person&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> Person<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> Persons <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #000000;">&#91;</span>XmlRoot<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;person&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person
<span style="color: #000000;">&#123;</span>
    <span style="color: #000000;">&#91;</span>XmlElement<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;name&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#91;</span>XmlAttribute<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;age&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Age <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</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;">// データ準備</span>
<span style="color: #FF0000;">var</span> data <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> People
<span style="color: #000000;">&#123;</span>
    Count <span style="color: #008000;">=</span> <span style="color: #FF0000;">2</span>,
    Persons <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: #008000;">new</span> Person <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;山本山&quot;</span>, Age <span style="color: #008000;">=</span> <span style="color: #FF0000;">99</span> <span style="color: #000000;">&#125;</span>,
    <span style="color: #008000;">new</span> Person <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;トマト&quot;</span>, Age <span style="color: #008000;">=</span> <span style="color: #FF0000;">19</span> <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>;
<span style="color: #FF0000;">var</span> xml <span style="color: #008000;">=</span> <span style="">@&quot;
    &lt;people&gt;
        &lt;count&gt;2&lt;/count&gt;
        &lt;persons&gt;
            &lt;person age=&quot;</span><span style="color: #666666;">&quot;14&quot;</span><span style="color: #666666;">&quot;&gt;
                &lt;name&gt;ほむ&lt;/name&gt;
            &lt;/person&gt;
            &lt;person age=&quot;</span><span style="color: #666666;">&quot;999&quot;</span><span style="color: #666666;">&quot;&gt;
                &lt;name&gt;いか&lt;/name&gt;
            &lt;/person&gt;
        &lt;/persons&gt;
    &lt;/people&gt;&quot;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</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>People<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// シリアライズ</span>
<span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    serializer.<span style="color: #0000FF;">Serialize</span><span style="color: #000000;">&#40;</span>ms, data<span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>ms.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, 0, <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>ms.<span style="color: #0000FF;">Length</span><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: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> sr <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> StringReader<span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>People<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">Deserialize</span><span style="color: #000000;">&#40;</span>sr<span style="color: #000000;">&#41;</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> value.<span style="color: #0000FF;">Persons</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>item.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> item.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 出力結果のXMLは↑に書いたXMLと同じようなものなので割愛</span></pre></div></div>


<p>ちょっと属性制御が面倒ですが、それなりに分かりやすく書けます。他によく使うのは無視して欲しいプロパティを指定するXmlIgnoreかしら。さて、そんな便利なXmlSerializerですが、XML化するクラスに制限があります。有名所ではDictionaryがシリアライズできねえええええ！とか。小細工して回避することは一応可能ですが、そんな無理するぐらいなら使うのやめたほうがいいでしょう、シリアライザは別にXmlSerializerだけじゃないのだから。</p>

<p>というわけで、XmlSerializerの利用シーンのお薦めは、ネットワークから外部APIを叩いて手に入るXMLをクラスにマッピングするところです。柔軟な属性制御により、マッピングできないケースは(多分)ないでしょう。いや、分かりませんが。まあ、ほとんどのケースでは大丈夫でしょう！しかし、LINQ to XMLの登場により、手書きで変換するのも十分お手軽なってしまったので、こうして分かりにくい属性制御するぐらいならXElement使うよ、というケースのほうが多いかもしれません。結局、XML構造をそのまま映すことしかできないので、より細かく変換できたほうが良い場合もずっとあって。</p>

<p>実際、私はもう長いことXmlSerializer使ってない感じ。LINQ to XMLは偉大。</p>

<h2>DataContractSerializer</h2>

<p>割と新顔ですが、もう十分古株と言ってよいでしょう(どっちだよ)。XmlSerializerと同じくオブジェクトをXMLに変換するのですが、その機能はずっと強力です。Dictionaryだってなんだってシリアライズできますよ、というわけで、現在では.NETの標準シリアライザはこいつです。</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: #FF0000;">var</span> data <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;山本山&quot;</span>, Age <span style="color: #008000;">=</span> <span style="color: #FF0000;">99</span> <span style="color: #000000;">&#125;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Person<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> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    serializer.<span style="color: #0000FF;">WriteObject</span><span style="color: #000000;">&#40;</span>ms, data<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: #FF0000;">var</span> xml <span style="color: #008000;">=</span> Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>ms.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, 0, <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>ms.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</span>;
&nbsp;
    ms.<span style="color: #0000FF;">Position</span> <span style="color: #008000;">=</span> 0; <span style="color: #008080; font-style: italic;">// 巻き戻して……</span>
    <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// デシリアライズ</span>
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 山本山:99</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: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Person</span> <span style="color: #000066;">xmlns:i</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.datacontract.org/2004/07/SilverlightApplication34&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;Age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>99<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Age<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>山本山<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>とまあ、使い勝手はXmlSerializerと似たようなものです。おお、出力されるXMLは整形されていません。整形して出力したい場合は</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 出力を整形したい場合はXmlWriter/XmlWriterSettingsを挟む</span>
<span style="color: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</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> xw <span style="color: #008000;">=</span> XmlWriter.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span>ms, <span style="color: #008000;">new</span> XmlWriterSettings <span style="color: #000000;">&#123;</span> Indent <span style="color: #008000;">=</span> <span style="color: #0600FF;">true</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    serializer.<span style="color: #0000FF;">WriteObject</span><span style="color: #000000;">&#40;</span>xw, data<span style="color: #000000;">&#41;</span>;
&nbsp;
    xw.<span style="color: #0000FF;">Flush</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #FF0000;">var</span> xml <span style="color: #008000;">=</span> Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>ms.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, 0, <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>ms.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</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: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">&quot;1.0&quot;</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Person</span> <span style="color: #000066;">xmlns:i</span>=<span style="color: #ff0000;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span> <span style="color: #000066;">xmlns</span>=<span style="color: #ff0000;">&quot;http://schemas.datacontract.org/2004/07/SilverlightApplication34&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>99<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Age<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>山本山<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Name<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Person<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>


<p>さて、結果をXmlSerializerと見比べてみるとどうでしょう。名前空間が違います。SilverlightApplication34ってありますね。これは、私がこのXMLを出力するのに使ったSilverlightプロジェクトの名前空間です。ワシのConsoleApplicationは221まであるぞ（整理しろ）。さて、ではこのXMLをデシリアライズするのに、別のアプリケーション・別のクラスで使ってみるとどうでしょう？</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #0600FF;">namespace</span> TestSilverlightApp
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Age <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> partial <span style="color: #FF0000;">class</span> MainPage <span style="color: #008000;">:</span> UserControl
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">public</span> MainPage<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            InitializeComponent<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
            <span style="color: #FF0000;">var</span> xml <span style="color: #008000;">=</span> <span style="">@&quot;&lt;?xml version=&quot;</span><span style="color: #666666;">&quot;1.0&quot;</span><span style="color: #666666;">&quot; encoding=&quot;</span><span style="color: #666666;">&quot;utf-8&quot;</span><span style="color: #666666;">&quot;?&gt;
            &lt;Person xmlns:i=&quot;</span><span style="color: #666666;">&quot;http://www.w3.org/2001/XMLSchema-instance&quot;</span><span style="color: #666666;">&quot; xmlns=&quot;</span><span style="color: #666666;">&quot;http://schemas.datacontract.org/2004/07/SilverlightApplication34&quot;</span><span style="color: #666666;">&quot;&gt;
                &lt;Age&gt;99&lt;/Age&gt;
                &lt;Name&gt;山本山&lt;/Name&gt;
            &lt;/Person&gt;&quot;</span>;
&nbsp;
            <span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Person<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> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #008080; font-style: italic;">// System.Runtime.Serialization.SerializationExceptionが起こってデシリアライズできない</span>
                <span style="color: #008080; font-style: italic;">// 名前空間 'http://schemas.datacontract.org/2004/07/TestSilverlightApp' の要素 'Person' が必要です。</span>
                <span style="color: #008080; font-style: italic;">// 名前が 'Person' で名前空間が 'http://schemas.datacontract.org/2004/07/SilverlightApplication34' の 'Element' が検出されました。</span>
                <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>;
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<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;">// DataContract属性をクラスにつけた場合は</span>
<span style="color: #008080; font-style: italic;">// そのクラス内のDataMember属性をつけていないプロパティは無視される</span>
<span style="color: #000000;">&#91;</span>DataContract<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">Namespace</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span>, Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;person&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> Person
<span style="color: #000000;">&#123;</span>
    <span style="color: #000000;">&#91;</span>DataMember<span style="color: #000000;">&#40;</span>Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;name&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#91;</span>DataMember<span style="color: #000000;">&#40;</span>Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;age&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">int</span> Age <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</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;">// こんなプレーンなXMLも読み込める</span>
<span style="color: #FF0000;">var</span> xml <span style="color: #008000;">=</span> <span style="">@&quot;
    &lt;person&gt;
        &lt;age&gt;99&lt;/age&gt;
        &lt;name&gt;山本山&lt;/name&gt;
    &lt;/person&gt;&quot;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Person<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> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</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> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>属性面倒くせー、ですけれど、まあしょうがない。そうすれば外部からのXMLも読み込めるし、と思っていた時もありました。以下のようなケースではどうなるでしょうか？Personクラスは↑のものを使うとして。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// こんなさっきと少しだけ違うXMLがあるとして</span>
<span style="color: #FF0000;">var</span> xml <span style="color: #008000;">=</span> <span style="">@&quot;
    &lt;person&gt;
        &lt;name&gt;山本山&lt;/name&gt;
        &lt;age&gt;99&lt;/age&gt;
    &lt;/person&gt;&quot;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Person<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> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</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> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value.<span style="color: #0000FF;">Age</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>これは出力結果は「山本山:0」になります。Ageが0、つまり復元されませんでした。なぜかというと、XMLを見てください。nameが先で、ageが、後。DataContractSerializerは規程された順序に強く従います。DataMember属性のOrderプロパティで順序を与えるか、与えない場合はアルファベット順(つまりAgeが先でNameが後)となります。この辺は<a href="http://msdn.microsoft.com/ja-jp/library/ms729813.aspx">データ メンバーの順序</a>に書かれています。</p>

<p>と、いうような事情から、DataContractSerializerを外部XMLからの受け取りに使うのはお薦めしません。XmlSerializerなら順序無視なので大丈夫です。いや、普通は順序が変わったりなどしないだろう！と思わなくもなくもないけれど、意外とデタラメなのじゃないか、基本的にはお外からのデータが何もかも信用できるわけなどないのだ、とうがってしまい(TwitterのAPIとか胡散臭さいのを日常的に触っていると！)、厳しいかなって、思ってしまうのです。</p>

<p>しかし、オブジェクトの保存・復元用にはDataContractSerializerは無類の強さを発揮します。例えば設定用のクラスを丸ごとシリアライズ・デシリアライズとかね。iniにして、じゃなくてフツーはXMLにすると思いますが、それです、それ。Dictionaryだってシリアライズできるし、引数なしコントラクタがないクラスだってシリアライズできちゃうんですよ？</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: #000000;">&#91;</span>DataContract<span style="color: #000000;">&#93;</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ToaruClass
<span style="color: #000000;">&#123;</span>
    <span style="color: #000000;">&#91;</span>DataMember<span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name <span style="color: #000000;">&#123;</span> get; set; <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> ToaruClass<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> name<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        Name <span style="color: #008000;">=</span> name;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>



<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> toaru <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ToaruClass<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;たこやき&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractSerializer<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: #0600FF;">using</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    serializer.<span style="color: #0000FF;">WriteObject</span><span style="color: #000000;">&#40;</span>ms, toaru<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// シリアライズできるし</span>
&nbsp;
    ms.<span style="color: #0000FF;">Position</span> <span style="color: #008000;">=</span> 0;
    <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>ToaruClass<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// デシリアライズできる</span>
&nbsp;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">Name</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>ただし、対象クラスにDataContract属性をつけてあげる必要はあります。つけてないとシリアライズもデシリアライズもできません。</p>

<p>ちなみに何でコンストラクタがないのにインスタンス化出来るんだよ！というと、<a href="http://msdn.microsoft.com/ja-jp/library/system.runtime.serialization.formatterservices.getuninitializedobject.aspx">System.Runtime.Serialization.FormatterServices.GetUninitializedObject</a>を使ってインスタンス化しているからです（Silverlightの場合はアクセス不可能）。こいつはコンストラクタをスルーしてオブジェクトを生成する反則スレスレな存在です、というか反則です。チートであるがゆえに、対象クラスにはDataContract属性をつける必要があります。コンストラクタ無視してもいいよ、ということを保証してあげないとおっかない、というわけです。(GetUninitializedObjectメソッド自体は別に属性は不要で何でもインスタンス化できます、typeof(void)ですらインスタンス化できます、無茶苦茶である)</p>

<p>なお、このGetUninitializedObjectが使われるのはDataContract属性がついているクラスのみです。DataContract属性がついていなければ、普通のコンストラクタが呼ばれるし、逆にDataContract属性がついていると、例え引数をうけないコンストラクタがあったとしても、GetUninitializedObject経由となりコンストラクタは無視されます。DataContract属性を付ける時はコンストラクタ内でシリアライズで復元できない副作用のある処理をすべきではない。ということに注意してください。</p>

<p>また、.NET 4版ではprivateプロパティの値も復元できるのですが、Silverlightの場合は無理のようです。ということでフル.NETなら不変オブジェクトでもサクサク大勝利、と思ってたのですが、Silverlightでの不変オブジェクトのシリアライズ・デシリアライズは不可能のようです。保存したいなら、保存専用の代理のオブジェクトを立ててやるしかない感じでしょうかね。</p>

<p>そんなわけで微妙な点も若干残りはしますが、オブジェクトを保存するのにはDataContractSerializerがお薦めです。</p>

<h2>DataContractとSerializable</h2>

<p>シリアライズ可能なクラス、の意味でDataContract属性をつけているわけですが、じゃあSerializable属性は？というと、えーと、SerializableはSilverlightでは入っていなかったりするとおり、過去の遺物ですね。なかったということで気にしないようにしましょう。</p>

<h2>DataContractJsonSerializer</h2>

<p>今時の言語はJSONが簡単に扱えなきゃダメです。XMLだけ扱えればいい、なんて時代は過ぎ去りました。しかしC#は悲しいことに標準では……。いや、いや、Silverlightには<a href="http://msdn.microsoft.com/ja-jp/library/system.json.aspx">System.Json</a>がありますね。しかし.NET 4にはありません(.NET 4.5とWinRTには入ります)。いや、しかし.NET 4には<a href="http://dynamicjson.codeplex.com/">DynamicJson</a>があります(それ出していいならJSON.NETがあるよ、で終わりなんですけどね)。が、Windows Phone 7には何もありません。ああ……。</p>

<p>とはいえ、シリアライザならば用意されています。DataContractJsonSerializerです。</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: #FF0000;">var</span> data <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Person <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;山本山&quot;</span>, Age <span style="color: #008000;">=</span> <span style="color: #FF0000;">99</span> <span style="color: #000000;">&#125;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractJsonSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Person<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> ms <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    serializer.<span style="color: #0000FF;">WriteObject</span><span style="color: #000000;">&#40;</span>ms, data<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: #FF0000;">var</span> xml <span style="color: #008000;">=</span> Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetString</span><span style="color: #000000;">&#40;</span>ms.<span style="color: #0000FF;">ToArray</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, 0, <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span>ms.<span style="color: #0000FF;">Length</span><span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>xml<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// {&quot;Age&quot;:99,&quot;Name&quot;:&quot;山本山&quot;}</span>
&nbsp;
    ms.<span style="color: #0000FF;">Position</span> <span style="color: #008000;">=</span> 0; <span style="color: #008080; font-style: italic;">// 巻き戻して……</span>
    <span style="color: #FF0000;">var</span> value <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// デシリアライズ</span>
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 山本山:99</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>使い勝手はDataContractSerializerと完全に一緒です。ただし、違う点が幾つか。名前空間が（そもそもJSONで表現不可能なので）なくなったのと、順序も関係なく復元可能です。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> json1 <span style="color: #008000;">=</span> <span style="">@&quot;{&quot;</span><span style="color: #666666;">&quot;Name&quot;</span><span style="color: #666666;">&quot;:&quot;</span><span style="color: #666666;">&quot;山本山&quot;</span><span style="color: #666666;">&quot;,&quot;</span><span style="color: #666666;">&quot;Age&quot;</span><span style="color: #666666;">&quot;:99}&quot;</span>;
<span style="color: #FF0000;">var</span> json2 <span style="color: #008000;">=</span> <span style="">@&quot;{&quot;</span><span style="color: #666666;">&quot;Age&quot;</span><span style="color: #666666;">&quot;:99,&quot;</span><span style="color: #666666;">&quot;Name&quot;</span><span style="color: #666666;">&quot;:&quot;</span><span style="color: #666666;">&quot;山本山&quot;</span><span style="color: #666666;">&quot;}&quot;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> DataContractJsonSerializer<span style="color: #000000;">&#40;</span><span style="color: #008000;">typeof</span><span style="color: #000000;">&#40;</span>Person<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> ms1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>json1<span style="color: #000000;">&#41;</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> ms2 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> MemoryStream<span style="color: #000000;">&#40;</span>Encoding.<span style="color: #0000FF;">UTF8</span>.<span style="color: #0000FF;">GetBytes</span><span style="color: #000000;">&#40;</span>json2<span style="color: #000000;">&#41;</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> value1 <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms1<span style="color: #000000;">&#41;</span>;
    <span style="color: #FF0000;">var</span> value2 <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Person<span style="color: #000000;">&#41;</span>serializer.<span style="color: #0000FF;">ReadObject</span><span style="color: #000000;">&#40;</span>ms2<span style="color: #000000;">&#41;</span>;
&nbsp;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value1.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value2.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>;
    Debug.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>value2.<span style="color: #0000FF;">Name</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;:&quot;</span> <span style="color: #008000;">+</span> value2.<span style="color: #0000FF;">Age</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>というわけで、随分とDataContractSerializerよりも使い勝手が良い模様。いい話だなー。さて、難点は出力されるJSONの整形が不可能です。DataContractSerializerではXmlWriterSettingsで行えましたが、DataContractJsonSerializerではそれに相当するものがありません。というわけでヒューマンリーダブルな形で出力、とはならず、一行にドバーっとまとめて吐かれるのでかなり苦しい。</p>

<p>もう一つ、これは本当に大したことない差なのでどうでもいいのですが、DataContractSerializerのほうが速いです。理由は単純でDataContractSerializerに一枚被せる形でDataContractJsonSerializerが実装されているから。その辺の絡みで.NET 4には<a href="http://msdn.microsoft.com/ja-jp/library/system.runtime.serialization.json.jsonreaderwriterfactory.aspx">JsonReaderWriterFactory</a>などがあって、これを直に触ってJSON→XML変換をするとLINQ to XMLを通したJSONの直接操作が標準ライブラリのみで可能なのですが、Silverlight/Windows Phone 7では残念なことに触ることができません。</p>

<p>外部APIを叩いて変換する際に、シリアライズはお手軽で便利であると同時に、完全に同一の形のオブジェクトを用意しなければならなくて、かったるい側面もあります。LINQ to XML慣れしていると特に。そういった形でJSONを扱いたい場合、WP7では<a href="http://json.codeplex.com/">Json.NET</a>を使う、しかありません。使えばいいんぢゃないかな、どうせNuGetでサクッと入れられるのだし。</p>

<p>とはいえまあ、そう言うほど使いづらいわけでもないので、標準のみでJSONを扱いたいという場合は、DataContractJsonSerializerが第一にして唯一の選択肢になります。</p>

<h2>JavaScriptSerializer</h2>

<p>.NET Framework 4.0 Client Profileでは使えないのですが、FullならばSystem.Web.Extensionを参照することでJavaScriptSerializerが使えます。もはや完全にSilverlightと関係ないのでアレですが、少し見てみましょう。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> serializer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> JavaScriptSerializer<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> target <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;ほむほむ&quot;</span>, Age <span style="color: #008000;">=</span> <span style="color: #FF0000;">14</span> <span style="color: #000000;">&#125;</span>;
<span style="color: #FF0000;">var</span> json <span style="color: #008000;">=</span> serializer.<span style="color: #0000FF;">Serialize</span><span style="color: #000000;">&#40;</span>target<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// stringを返す</span></pre></div></div>


<p>Serializeで文字列としてのJSONを返す、というのがポイントです。それと、シリアライザ作成時にtypeを指定しません。また、匿名型もJSON化することが可能です（これはDataContractSerializerでは絶対無理）。ただし、コンストラクタのないクラスのデシリアライズは不可能です。</p>

<p>中々使い勝手がいいですね！で、これは、リフレクションベースの非常に素朴な実装です。だから匿名型でもOKなんですねー。ちょっとした用途には非常に楽なのですが、Client Profileでは使えないこともありますし(ASP.NETで使うために用意されてる)、あまり積極的に使うべきものではないと思います。ちなみに、一時期ではObsoleteになっていてDataContractJsonSerializer使え、と出ていたのですが、またObsoleteが外され普通に使えるようになりました。やはり標準シリアライザとしてはDataContractJsonSerializerだけだと重すぎる、ということでしょうか。</p>

<h2>バイナリとか</h2>

<p>別にシリアライズってXMLやJSONだけじゃあないのですね。サードパーティ製に目を向ければ、色々なものがあります。特に私がお薦めなのは<a href="http://code.google.com/p/protobuf-net/">protobuf-net</a>。これはGoogleが公開しているProtocol Buffersという仕様を.NETで実装したものなのですが、とにかく速い。めちゃくちゃ速い。稀代のILマスターが書いているだけある恐ろしい出来栄えです。SilverlightやWP7版もあるので、Protocol Buffersの本来の用途というだけなく、幅広く使えるのではかとも思います。</p>

<p>もう一つは国内だと最近目にすることの多い<a href="http://msgpack.org/">MessagePack</a>。以前に<a href="http://neue.cc/2010/05/29_261.html">.NET(C#)におけるシリアライザのパフォーマンス比較</a>を書いたときは振るわないスコアでしたが、最近別のC#実装が公開されまして、それは作者によるベンチ<a href="https://oikw.org/memo/2011/04/23/0">MessagePack for .NET (C#) を書いた</a>によると、protobuf-netよりも速いそうです。</p>

<h2>Next</h2>

<p>というわけでSilverlight枠でいいのか怪しかったですが、シリアライザの話でした。次は<a href="https://twitter.com/#!/ugaya40">@ugaya40</a>さんのWeakEventの話です。引き続きチェックを。あ、あと、Silverlight Advent Calendarはまだ埋まってない（！）ので、是非是非参加して、埋めてやってください。申し込みは<a href="http://atnd.org/events/22001">Silverlight Advent Calendar 2011</a>から。皆さんのエントリ、待ってます。どうやらちょうど今日Silverlight 5がリリースされたようなので、SL5の新機能ネタとかいいんじゃないでしょうか。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/12/10_357.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>自家製拡張メソッド制作のすすめ だいx回 BufferWithPadding</title>
		<link>http://neue.cc/2011/12/09_356.html</link>
		<comments>http://neue.cc/2011/12/09_356.html#comments</comments>
		<pubDate>Thu, 08 Dec 2011 16:23:59 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/12/09_356.html</guid>
		<description><![CDATA[Ix(Interactive Extensions)は使っていますか？Rxから逆移植されてきている(IxのNuGet上のアイコンはRxのアイコンの逆向きなのですね)、LINQ to Objectsを更に拡張するメソッド群です。みんな大好きForEachなど、色々入っています。その中でも、私はBufferというものをよく使っています。Ixが]]></description>
			<content:encoded><![CDATA[<p><a href="http://nuget.org/packages/Ix_Experimental-Main">Ix(Interactive Extensions)</a>は使っていますか？Rxから逆移植されてきている(IxのNuGet上のアイコンはRxのアイコンの逆向きなのですね)、LINQ to Objectsを更に拡張するメソッド群です。みんな大好きForEachなど、色々入っています。その中でも、私はBufferというものをよく使っています。Ixが参照できない場合は何度も何度も自作するぐらいに使いどころいっぱいあって、便利です。こんなの。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 指定個数分をまとめたIList&lt;T&gt;を返します</span>
<span style="color: #008080; font-style: italic;">// 第二引数を使うとずらす個数を指定することもできます</span>
<span style="color: #008080; font-style: italic;">// これの結果は</span>
<span style="color: #008080; font-style: italic;">// 0123</span>
<span style="color: #008080; font-style: italic;">// 4567</span>
<span style="color: #008080; font-style: italic;">// 89</span>
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> xs <span style="color: #0600FF;">in</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span>0, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Buffer</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    xs.<span style="color: #0600FF;">ForEach</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#41;</span>;
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>標準でこういうのできないのー？というと、できないんですよねえ、残念なことに。</p>

<p>さて、ところで、この場合、指定個数に足りなかった場合はその分縮められたものが帰ってきます。上の例だと返ってくるListの長さは4, 4, 2でした。でも、埋めて欲しい場合ってあります。足りない分は0で埋めて長さは4, 4, 4であって欲しい、と。そこはLINQなので、創意工夫で頑張りましょう。例えば</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// EnumerableEx.Repeatは指定の値の無限リピート</span>
<span style="color: #008080; font-style: italic;">// それと結合して、Takeで詰めることで足りない場合だけ右を埋めることが出来る</span>
<span style="color: #008080; font-style: italic;">// 0123</span>
<span style="color: #008080; font-style: italic;">// 4567</span>
<span style="color: #008080; font-style: italic;">// 8900</span>
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> xs <span style="color: #0600FF;">in</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span>0, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Buffer</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    xs.<span style="color: #0000FF;">Concat</span><span style="color: #000000;">&#40;</span>EnumerableEx.<span style="color: #0000FF;">Repeat</span><span style="color: #000000;">&#40;</span>0<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Take</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span>.<span style="color: #0600FF;">ForEach</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#41;</span>;
    Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>EnumerableEx.RepeatはIxにある無限リピート。Ixを参照しない場合は Enumerable.Repeat(value, int.MaxValue) で代用することも一応可能です。</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: #008080; font-style: italic;">// 0123</span>
<span style="color: #008080; font-style: italic;">// 4567</span>
<span style="color: #008080; font-style: italic;">// 89-1-1</span>
<span style="color: #0600FF;">foreach</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">var</span> xs <span style="color: #0600FF;">in</span> Enumerable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span>0, <span style="color: #FF0000;">10</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">BufferWithPadding</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">4</span>, <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    xs.<span style="color: #0600FF;">ForEach</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">Write</span><span style="color: #000000;">&#41;</span>;
    Console.<span style="color: #0000FF;">WriteLine</span><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;">static</span> <span style="color: #FF0000;">class</span> EnumerableExtensions
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IEnumerable<span style="color: #008000;">&lt;</span>T<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">&gt;</span> BufferWithPadding<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> IEnumerable<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> source, <span style="color: #FF0000;">int</span> count, T paddingValue <span style="color: #008000;">=</span> <span style="color: #0600FF;">default</span><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>source <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> ArgumentNullException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;source&quot;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>count <span style="color: #008000;">&lt;=</span> 0<span style="color: #000000;">&#41;</span> <span style="color: #0600FF;">throw</span> <span style="color: #008000;">new</span> ArgumentOutOfRangeException<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;count&quot;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #0600FF;">return</span> BufferWithPaddingCore<span style="color: #000000;">&#40;</span>source, count, paddingValue<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">static</span> IEnumerable<span style="color: #008000;">&lt;</span>T<span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">&gt;</span> BufferWithPaddingCore<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> IEnumerable<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> source, <span style="color: #FF0000;">int</span> count, T paddingValue<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> buffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> T<span style="color: #000000;">&#91;</span>count<span style="color: #000000;">&#93;</span>;
        <span style="color: #FF0000;">var</span> index <span style="color: #008000;">=</span> 0;
        <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> source<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            buffer<span style="color: #000000;">&#91;</span>index<span style="color: #008000;">++</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> item;
            <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>index <span style="color: #008000;">==</span> count<span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">yield</span> <span style="color: #0600FF;">return</span> buffer;
                index <span style="color: #008000;">=</span> 0;
                buffer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> T<span style="color: #000000;">&#91;</span>count<span style="color: #000000;">&#93;</span>;
            <span style="color: #000000;">&#125;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>index <span style="color: #008000;">!=</span> 0<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span>; index <span style="color: #008000;">&lt;</span> count; index<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                buffer<span style="color: #000000;">&#91;</span>index<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> paddingValue;
            <span style="color: #000000;">&#125;</span>
            <span style="color: #0600FF;">yield</span> <span style="color: #0600FF;">return</span> buffer;
        <span style="color: #000000;">&#125;</span>
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>すっきりしますね！Emptyの時は何も列挙しないようにしていますが、Emptyの時は埋めたのを一つ欲しい、と思う場合は最後のifの囲みを外せばOK。あと、最後のif&#8230;for&#8230;yieldの部分を var dest = new T[index]; Array.Copy(buffer, dest, index); yield return dest; に変えればパディングしないBufferになります。Ix参照したくないけどBuffer欲しいなあ、と思ったときにコピペってどうぞ。</p>

<p>本体のコードと引数チェックを分けているのは、yield returnは本体が丸ごと遅延評価されるため、引数チェックのタイミング的によろしくないからです。少し面倒ですが、分割するのが良い書き方。詳しくは<a href="http://neue.cc/2011/08/15_338.html">neue cc - 詳説Ix Share/Memoize/Publish編(もしくはyield returnの注意点)</a>で書いていますので見てください。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/12/09_356.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Reactive Extensionsとスレッドのlock</title>
		<link>http://neue.cc/2011/11/30_355.html</link>
		<comments>http://neue.cc/2011/11/30_355.html#comments</comments>
		<pubDate>Wed, 30 Nov 2011 14:48:12 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

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

		<guid isPermaLink="false">http://neue.cc/2011/11/30_355.html</guid>
		<description><![CDATA[ぱられるぱられる。もしパラレルにイベントが飛んできたら、どうする？


public class TestParallel
&#123;
    public event Action&#60;int&#62; Log = _ =&#62; &#123; &#125;; // nullチェック面倒ぃので
&#160;
    public void Raise&#40;&#41;
    &#123;
        // デュアルコア以上のマシンで試してね！
        Parallel.For&#40;0, 10000000, x =&#62;
        &#123;
 [...]]]></description>
			<content:encoded><![CDATA[<p>ぱられるぱられる。もしパラレルにイベントが飛んできたら、どうする？</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> TestParallel
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">event</span> Action<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> Log <span style="color: #008000;">=</span> _ <span style="color: #008000;">=&gt;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#125;</span>; <span style="color: #008080; font-style: italic;">// nullチェック面倒ぃので</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Raise<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;">// デュアルコア以上のマシンで試してね！</span>
        Parallel.<span style="color: #0600FF;">For</span><span style="color: #000000;">&#40;</span>0, <span style="color: #FF0000;">10000000</span>, x <span style="color: #008000;">=&gt;</span>
        <span style="color: #000000;">&#123;</span>
            Log<span style="color: #000000;">&#40;</span>x<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;">&#125;</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> list <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> tes <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TestParallel<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// イベント登録して</span>
        tes.<span style="color: #0000FF;">Log</span> <span style="color: #008000;">+=</span> x <span style="color: #008000;">=&gt;</span> list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span>x<span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 実行</span>
        tes.<span style="color: #0000FF;">Raise</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>これは、十中八九、例外が出ます。list.Addはスレッドセーフじゃないので、まあそうだよね、と。では、Rxを使ってみるとどうなるでしょうか。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> list <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">var</span> tes <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TestParallel<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// イベント登録して</span>
Observable.<span style="color: #0000FF;">FromEvent</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>h <span style="color: #008000;">=&gt;</span> tes.<span style="color: #0000FF;">Log</span> <span style="color: #008000;">+=</span> h, h <span style="color: #008000;">=&gt;</span> tes.<span style="color: #0000FF;">Log</span> <span style="color: #008000;">-=</span> h<span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// 実行</span>
tes.<span style="color: #0000FF;">Raise</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>やはり変わりません。例外出ます。FromEventを中継しているだけですから……。さて、しかし一々Addの手前でlockするのは面倒だ、と、そこでSynchronizeメソッドが使えます。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;">Observable.<span style="color: #0000FF;">FromEvent</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>h <span style="color: #008000;">=&gt;</span> tes.<span style="color: #0000FF;">Log</span> <span style="color: #008000;">+=</span> h, h <span style="color: #008000;">=&gt;</span> tes.<span style="color: #0000FF;">Log</span> <span style="color: #008000;">-=</span> h<span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Synchronize</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>list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// ようするにこんな感じになってる</span>
&nbsp;
<span style="color: #FF0000;">var</span> gate <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">Object</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #008080; font-style: italic;">//....</span>
<span style="color: #0600FF;">lock</span><span style="color: #000000;">&#40;</span>gate<span style="color: #000000;">&#41;</span>
<span style="color: #000000;">&#123;</span>
    OnNext<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>これで、list.Addを問題なく動作させられます。Listとか適度にデリケートなので適当に注意してあげましょう。</p>

<h2>Subjectの場合</h2>

<p>さて、上のはイベントでしたが、ではSubjectの場合はどうなるでしょう。</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> TestParallel
<span style="color: #000000;">&#123;</span>
    Subject<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> logMessenger <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Subject<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #0600FF;">public</span> IObservable<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span> Log <span style="color: #000000;">&#123;</span> get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> logMessenger.<span style="color: #0000FF;">AsObservable</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>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> Raise<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;">// デュアルコア以上のマシンで試してね！</span>
        Parallel.<span style="color: #0600FF;">For</span><span style="color: #000000;">&#40;</span>0, <span style="color: #FF0000;">10000000</span>, x <span style="color: #008000;">=&gt;</span>
        <span style="color: #000000;">&#123;</span>
            logMessenger.<span style="color: #0000FF;">OnNext</span><span style="color: #000000;">&#40;</span>x<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;">&#125;</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> list <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> List<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> tes <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TestParallel<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// イベント登録して</span>
        tes.<span style="color: #0000FF;">Log</span>.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 実行</span>
        tes.<span style="color: #0000FF;">Raise</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>たまーに例外起こらず処理できることもあるんですが、まあ大体は例外起こるんじゃないかと思います。初期のRxのSubjectは割とガチガチにlockされてたのですが、現在はパフォーマンスが優先されているため挙動が変更され、ゆるゆるです。回避策は同様にSynchronizeを足すことです。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;">tes.<span style="color: #0000FF;">Log</span>.<span style="color: #0000FF;">Synchronize</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>list.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>これで問題なし。</p>

<h2>余談</h2>

<p>手元に残っていた大昔のRxを使って実行してみたら、死ぬほど遅かったり。確実に現在のものはパフォーマンス上がっていますねえ。あと、なんかもう最近面倒でeventだからってEventArgs使わなきゃならないなんて誰が言ったー、とActionばかり使うという手抜きをしてます。だってsenderいらないもん、大抵のばやい。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/11/30_355.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>ReactiveProperty ver 0.3.0.0 - MとVMのバインディングという捉え方</title>
		<link>http://neue.cc/2011/11/20_354.html</link>
		<comments>http://neue.cc/2011/11/20_354.html#comments</comments>
		<pubDate>Sun, 20 Nov 2011 13:38:53 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

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

		<guid isPermaLink="false">http://neue.cc/2011/11/20_354.html</guid>
		<description><![CDATA[今回の更新よりアイコンが付きました。専用のアイコンがあると、とっても本格的な感じがしますねー。色はRxにあわせて紫-赤紫。デザインは私の好みな幾何学的な感じです。@ocazucoさんに作って頂きました、ありがとうございます！]]></description>
			<content:encoded><![CDATA[<p>今回の更新よりアイコンが付きました。専用のアイコンがあると、とっても本格的な感じがしますねー。色はRxにあわせて紫-赤紫。デザインは私の好みな幾何学的な感じです。@ocazucoさんに作って頂きました、ありがとうございます！色々ワガママ言ってお手数かけました。</p>

<p class="noindent">
    <img src="http://neue.cc/ReactivePropertyIcon_100x100.png">
<a href="http://reactiveproperty.codeplex.com/">ReactiveProperty - MVVM Extensions for Rx - ver 0.3.0.0</a>
</p>

<p>Rxとは何か、というとIObservable&lt;T>と「見なせる」ものを合成するためのライブラリです。だから、見なせるものさえ見つかれば、活躍の幅は広がっていく。ReactivePropertyは色々なものを、そのように「見なして」いくことで、RxでOrchestrateできる幅をドラスティックに広げます。土台にさえ乗せてしまえば、あとはRxにお任せ。その場合に大切なのは、土台に乗せられるよう、閉じないことです。しかし、もし閉じているのなら、開くための鍵を提供します。</p>

<h2>デフォルトモード変更</h2>

<p>ReactivePropertyのデフォルトモードが DistinctUntilChanged|RaiseLatestValueOnSubscribe になりました。今まではRaise&#8230;が入ってなかったのですが、思うところあって変わりました。例えばCombineLatestは、全てが一度は発火していないと動き出しません。ReactiveCommandの条件に使うなどの場合にRaiseしてくれないと不都合極まりなく、かつ、Subscribeと同時にRaiseすることによる不都合なシーンは逆に少ない。ことを考えると、必然的にデフォルトをどちらに振るべきかは、分かりきった話でした。</p>

<p>そのことは0.1の時、サンプル作りながら思ってたんですが悩んだ末に、省いちゃったんですねえ。RaiseLatestValueOnSubscribeが入ると不便なシーンもある(initialValueを設定しないとまず最初にnullが飛んでいくとか)ので、どちらを取るかは悩ましいところではあるんですが、シチュエーションに応じて最適なほうを選んでください、としか言いようがないところです。</p>

<h2>ToReactivePropertyAsSynchronized</h2>

<p>長い。メソッド名が。</p>

<p>これは何かというとINotifyPropertyChanged->ReactiveProperty変換です。今までもObservePropertyメソッド経由で変換できましたが、それは一度IObservable&lt;T>に変換するため、Model→ReactivePropertyという一方向のPushでしかありませんでした。Two-wayでのバインドで値の同期を取りたい場合は、今回から搭載されたToReactivePropertyAsSynchronizedを使ってください。</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> ObservableObject <span style="color: #008000;">:</span> INotifyPropertyChanged
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> name;
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name
    <span style="color: #000000;">&#123;</span>
        get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> name; <span style="color: #000000;">&#125;</span>
        set
        <span style="color: #000000;">&#123;</span>
            name <span style="color: #008000;">=</span> value;
            PropertyChanged<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>, <span style="color: #008000;">new</span> PropertyChangedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Name&quot;</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;">event</span> PropertyChangedEventHandler PropertyChanged <span style="color: #008000;">=</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: #000000;">&#125;</span>;
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// それを使ったViewModelを作るなら</span>
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> TwoWayViewModel
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> OneWay <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> TwoWay <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> TwoWayViewModel<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> inpc <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ObservableObject <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;ヤマダ&quot;</span> <span style="color: #000000;">&#125;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// ObservePropertyを使うとIObservable&lt;T&gt;に変換できます</span>
        <span style="color: #008080; font-style: italic;">// ラムダ式でプロパティを指定するので、完全にタイプセーフです</span>
        <span style="color: #008080; font-style: italic;">// それをToReactivePropertyすればOneWayで同期したReactivePropertyになります</span>
        OneWay <span style="color: #008000;">=</span> inpc.<span style="color: #0000FF;">ObserveProperty</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToReactiveProperty</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// ToReactivePropertyAsSynchronizedで双方向に同期することができます</span>
        TwoWay <span style="color: #008000;">=</span> inpc.<span style="color: #0000FF;">ToReactivePropertyAsSynchronized</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>INotifyProeprtyChangedなModelをReactivePropertyなViewModelに持っていきたい時などに、使いやすいのではと思います。また、同期する型が異なっていても対応することができます。コンバーターのようにconvertとconvertBackを指定してください。</p>

<h2>ReactiveProperty.FromObject</h2>

<p>こちらもToReactivePropertyの亜種ですが、ReactiveProperty→Modelというソース方向への片方向の同期を取ります。ModelはINotifyPropertyChangedである必要はありません。</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> PlainObject
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name <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: #FF0000;">class</span> OneWayToSourceViewModel
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> OneWayToSource <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> OneWayToSourceViewModel<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">var</span> poco <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> PlainObject <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;ヤマダ&quot;</span> <span style="color: #000000;">&#125;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// ReactiveProperty.FromObjectで変換することができます</span>
        <span style="color: #008080; font-style: italic;">// この場合、ReactiveProperty -&gt; Objectの方向のみ値が流れます</span>
        OneWayToSource <span style="color: #008000;">=</span> ReactiveProperty.<span style="color: #0000FF;">FromObject</span><span style="color: #000000;">&#40;</span>poco, x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>片方向の同期が定型的な局面、例えば設定クラスなんかは通知は必要ないと思うのですが、それをUIから一方向で値を投影したい場合に、これを使うことで楽になると思います。</p>

<p>また、Sampleにこれら3つの解説を追加しましたので、実際にどう反映されるのか、動きを確認したい場合はそちらを見てください。</p>

<h2>CombineLatestValuesAreAllTrue</h2>

<p>長い。メソッド名が。これは<a href="http://d.hatena.ne.jp/okazuki/20111027/1319722680">Reactive Extensionsお題 - かずきのBlog@Hatena</a>に書かれているもので、使うシーンよくありそうな頻出パターンになりそうだと思ったので、お借りすることにしました。ありがとうございます。使い方を見てもらったほうが速いので、まず例を。</p>

<p class="noindent">
<object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="640px" height="100px">
  <param name="source" value="http://neue.cc/wp-content/uploads/silverlight/ReactivePropertyComibineLatestAllTrue.xap"/>
  <param name="background" value="white" />
  <param name="minRuntimeVersion" value="3.0.40624.0" />
  <param name="autoUpgrade" value="true" />
  <param name="initparams" value="Start=0" />
  <a href="http://go.microsoft.com/fwlink/?LinkID=149156&#038;v=3.0.40624.0" style="text-decoration:none">
      <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Microsoft Silverlight を入手" style="border-style:none"/>
  </a>
</object>
</p>


<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;StackPanel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;StackPanel</span> <span style="color: #000066;">Orientation</span>=<span style="color: #ff0000;">&quot;Horizontal&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CheckBox</span> <span style="color: #000066;">IsChecked</span>=<span style="color: #ff0000;">&quot;{Binding IsCheckedA.Value, Mode=TwoWay}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Check A<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CheckBox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CheckBox</span> <span style="color: #000066;">IsChecked</span>=<span style="color: #ff0000;">&quot;{Binding IsCheckedB.Value, Mode=TwoWay}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Check B<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CheckBox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;CheckBox</span> <span style="color: #000066;">IsChecked</span>=<span style="color: #ff0000;">&quot;{Binding IsCheckedC.Value, Mode=TwoWay}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Check C<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/CheckBox<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/StackPanel<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;Button</span> <span style="color: #000066;">Command</span>=<span style="color: #ff0000;">&quot;{Binding ExecCommand}&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>全部チェックで押せる<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Button<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/StackPanel<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;">// using Codeplex.Reactive.Extensions; (これを忘れないように)</span>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> MainPageViewModel
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span> IsCheckedA <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span> IsCheckedB <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span> IsCheckedC <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
    <span style="color: #0600FF;">public</span> ReactiveCommand ExecCommand <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> MainPageViewModel<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        IsCheckedA <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        IsCheckedB <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        IsCheckedC <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">bool</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        ExecCommand <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> IsCheckedA, IsCheckedB, IsCheckedC <span style="color: #000000;">&#125;</span>
            .<span style="color: #0000FF;">CombineLatestValuesAreAllTrue</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">ToReactiveCommand</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        ExecCommand.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</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;しんぷる！&quot;</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></pre></div></div>


<p>3つのチェックボックスが全てONなら実行可能なコマンドを作る、です。こんな風に、全てがtrueの時、といった集約をしたい場合に便利に使うことができます。プレゼンテーションロジック、に該当する部分だと思いますが、ここでもRxは十分以上に活躍できます。また、外部からCanExecuteChangedをぶっ叩くようなカオティックなこともしません、ReactiveCommandならね。</p>

<h2>ReactiveTimer</h2>

<p>Timerです。.NETはTimerが山のようにあります。Threading.Timer, Timers.Timer, Forms.Timer, DispatcherTimer, Observable.Timer。ここにまたReactiveTimerという新たなるTimerが誕生し、人類を混乱の淵に陥れようとしていた……。まさにカオス。</p>

<p>ちょっと整理しましょう。まず、Threading.Timerは一番ネイティブなTimerと捉えられます。そのままだと少しつかいづらいので、軽くラップしてイベントベースにしたのがTimers.Timer。Forms.TimerとDispatcherTimerは、それぞれのアプリケーション基盤で時間を計って伝達してくれるというもの、UI系でのInvokeが不要になるので便利。と、それなりに役割の違いはあります。微妙な差ですが。</p>

<p>最後のObservable.TimerはIObservableで通達してくれるのでRxと非常に相性が良いタイマー。また、タイマーを行う場所もISchedulerで任意に指定できるので、ThreadPoolでもDispatcherでもCurrentThread(この場合はSleepで止まるので固まりますけどね)でも、もしくは仮想スケジューラ(任意に時間を動かせるのでテストが簡単になる)でも良いという柔軟さが素敵で、Rx以降のプログラミングではタイマーなんてObseravble.Timer一択だろ常識的に考えて。という勢い。(精度は若干落ちるので、よほど精度を求める時はThreading．Timerを使いましょう)。だと思っていた時もありました。</p>

<p>一時停止出来ないんですよ、Observable.Timer。発動したらしっぱなし。Stopはできる(Disposeする)けど、そうしたら再開は出来ない。それじゃあ困る場合があります！はい。結構あります。そういう場合はTimers.TimerをFromEventでラップする。それはそれで良いのですが、Observable.TimerのISchedulerを指定可能という柔軟さを捨てるのは勿体無いなあ、と思ったのでした。</p>

<p>そこで、今回ReactiveTimerを作りました。機能は、Observable.TimerのStop/Start出来る版です。</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> ReactiveTimerTest <span style="color: #008000;">:</span> ReactiveTest
<span style="color: #000000;">&#123;</span>
    <span style="color: #000000;">&#91;</span>TestMethod<span style="color: #000000;">&#93;</span>
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">void</span> TimerTest<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;">// テスト用の自由に時間を動かせるスケジューラ</span>
        <span style="color: #FF0000;">var</span> testScheduler <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> TestScheduler<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
        <span style="color: #FF0000;">var</span> recorder <span style="color: #008000;">=</span> testScheduler.<span style="color: #0000FF;">CreateObserver</span><span style="color: #008000;">&lt;</span><span style="color: #FF0000;">long</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 作成時点では動き出さない</span>
        <span style="color: #FF0000;">var</span> timer <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveTimer<span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>, testScheduler<span style="color: #000000;">&#41;</span>;
        timer.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>recorder<span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// Subscribeしても動き出さない</span>
&nbsp;
        timer.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><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;">// ここで開始。初期値を与えるとその時間後にスタート</span>
&nbsp;
        <span style="color: #008080; font-style: italic;">// 時間を絶対時間10秒のポイントまで進める(AdvanceTo)</span>
        testScheduler.<span style="color: #0000FF;">AdvanceTo</span><span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Ticks</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// MessagesにSubscribeに届いた時間と値が記録されているので、Assertする</span>
        recorder.<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>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">3</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Ticks</span>, 0L<span style="color: #000000;">&#41;</span>,
            OnNext<span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">4</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Ticks</span>, 1L<span style="color: #000000;">&#41;</span>,
            OnNext<span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Ticks</span>, 2L<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        timer.<span style="color: #0000FF;">Stop</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// timerを止める</span>
        recorder.<span style="color: #0000FF;">Messages</span>.<span style="color: #0000FF;">Clear</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;">// 時間を現在時間から5秒だけ進める(AdvanceBy)</span>
        testScheduler.<span style="color: #0000FF;">AdvanceBy</span><span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Ticks</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// timerは止まっているので値は届いてないことが確認できる</span>
        recorder.<span style="color: #0000FF;">Messages</span>.<span style="color: #0000FF;">Count</span>.<span style="color: #008000;">Is</span><span style="color: #000000;">&#40;</span>0<span style="color: #000000;">&#41;</span>;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>そう、単体テストしたい場合は、TestSchedulerに差し替えれば、AdvancedBy/Toによって、時間を自由に進めることが可能になります。Assertに使っているIs拡張メソッドは<a href="http://chainingassertion.codeplex.com/">Chaining Assertion</a>です。Testing周りの詳しい解説は<a href="http://d.hatena.ne.jp/ZOETROPE/20111031#1320077799">Rx-Testingの使い方 - ZOETROPEの日記</a>に書かれています。</p>

<h2>CountNotifier/BooleanNotifier</h2>

<p>SignalNotifierという名前はよく分からないので、今回よりCountNotifierに変更しました。また、名前空間をNotifiersに変更しました。更に、二値での通知を行うBooleanNotifierを新規追加しました。どちらも、IObservable経由での通知を行うフラグです。</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.Reactive.Notifiers;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 通知可能(IObservable)なboolean flag</span>
<span style="color: #FF0000;">var</span> boolFlag <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> BooleanNotifier<span style="color: #000000;">&#40;</span>initialValue<span style="color: #008000;">:</span> <span style="color: #0600FF;">false</span><span style="color: #000000;">&#41;</span>;
boolFlag.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>b <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>b<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
boolFlag.<span style="color: #0000FF;">TurnOn</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// trueにする, trueの状態だったら何もしない</span>
boolFlag.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> false; <span style="color: #008080; font-style: italic;">// .Valueで変更、既にfalseの状態でも通知する</span>
boolFlag.<span style="color: #0000FF;">SwitchValue</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;">// 通知可能(IObservable)なcount flag</span>
<span style="color: #FF0000;">var</span> countFlag <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> CountNotifier<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
countFlag.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>x<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
countFlag.<span style="color: #0000FF;">Increment</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// incしたり</span>
countFlag.<span style="color: #0000FF;">Decrement</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// decしたりの状態が通知される</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// Empty(0になった状態)という判定でフィルタして状態監視したりできる</span>
countFlag.<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> CountChangedStatus.<span style="color: #0000FF;">Empty</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>例えば非同期処理を行う際などの、状態の管理に使うことができます。</p>

<h2>Pairwise</h2>

<p><a href="http://neue.cc/2011/11/09_352.html">neue cc - Reactive Extensionsで前後の値を利用する</a>で書いた、前後の値をまとめる拡張メソッドです。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// { Old = 1, New = 2 }</span>
<span style="color: #008080; font-style: italic;">// { Old = 2, New = 3 }</span>
<span style="color: #008080; font-style: italic;">// { Old = 3, New = 4 }</span>
<span style="color: #008080; font-style: italic;">// { Old = 4, New = 5 }</span>
Observable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Pairwise</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>Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>古い値と新しい値を使って何かしたい場合などにどうぞ。</p>

<h2>CatchIgnore</h2>

<p>例外処理用に、OnErrorRetryというものを用意していましたが、今回それ以外にCatchIgnoreを追加しました。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// 1, 2</span>
Observable.<span style="color: #0000FF;">Range</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, <span style="color: #FF0000;">5</span><span style="color: #000000;">&#41;</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;">if</span> <span style="color: #000000;">&#40;</span>x <span style="color: #008000;">==</span> <span style="color: #FF0000;">3</span><span style="color: #000000;">&#41;</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: #0000FF;">CatchIgnore</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>Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#41;</span>;</pre></div></div>


<p>ようするに、CatchしてEmptyを返す手間を省くためのものです。onErrorにe => {}と書くのと似てますが、シーケンスの途中で捕まえれるので、メソッドチェーンの繋ぎ方によっては全然異なる役割を持つ可能性があります。</p>

<h2>その他の削除やバグ修正や見送ったものなど</h2>

<p>RxのExperimental版が更新されてたので、それに合わせました。Rxの更新内容はZipとCombineLatestに大量のオーバーロード+配列を受け入れるようになったので、何でも結合できるようになりました。それにともないReactivePropertyでは独自拡張としてCombineLatestのオーバーロードを用意していたのですが、Experimental版のみ削除しました。パフォーマンスもExperimentalのもののほうがずっと良いので、早くStableにも降りてきて欲しいです。</p>

<p>WebRequestのUploadValuesで、値が&amp;で連結されていないという致命的なバグがあったので修正しました。本当にすみません……。また、Silverlightでデザイン画面がプレビューできなくなる不具合を修正しました。デザインモード怖い。</p>

<p>バリデーション周りは、ちょっと大きめに(といっても内部だけの話で外部的には変わらない予定)変更入れようと思ってたのですが、それは次回で。あと、同期系メソッドもバリデーションの成否によって同期するかしないかを決定しようかなあ、とか思うんですが、ちょっと大変なので後になりそう。</p>

<h2>まとめ</h2>

<p>今回はデータリンクを主眼に置きました。デフォルトモードの変更もその一環です。直接的に意味を見るのなら、厚めのMをスマートにVMとシンクロナイズさせる、ということになります。冒頭の台詞、閉じた世界を開けるための道具です。ObserveProperty(OneWay)、ToReactivePropertyAsSynchronized(TwoWay)、ReactiveProperty.FromObject(OneWayToSource)。</p>

<p>OneWayとかTwoWayとかOneWayToSourceというとおり、VMとMの間のバインディングエンジンだと見ることができます。VとVMの間をWPFなりのフレームワークが担い吸収するように、ReactivePropertyはVMとMの間を吸収します。手書きでバインディングだと、ボイラープレートでは手間だし見通しも悪くなる。このほうが、ずっと、楽だし自然に書けます。</p>

<p>ReactivePropertyはV-VM間の接続も担うため、結果として全てがV-VM-M-VM-Vとして一つに繋がる。何をどう組もうと自然に一つに繋がっていく。わくわくしませんか？むしろカオスの予感がする？けれど、カオスの先に本当の光がある、……かもしれない。</p>

<p>ちなみに同期系のものはみんなプロパティ指定だけでGetとかSetとか自動でやっていますが、動的コード生成(＆キャッシュ)によりハイパー高速化されているので、パフォーマンス上の問題はありません。そこは安心してください。というと何か凄そうなことやってる気がしますが、勿論そんなことはなくて、偉大なるExpressionTreeに全面的にお任せしているだけだったり。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/11/20_354.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>XboxInfoTwit - ver.2.4.0.0</title>
		<link>http://neue.cc/2011/11/13_353.html</link>
		<comments>http://neue.cc/2011/11/13_353.html#comments</comments>
		<pubDate>Sun, 13 Nov 2011 11:38:38 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[XboxInfoTwit]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/11/13_353.html</guid>
		<description><![CDATA[
neue cc - XboxInfoTwit


Xbox.comがリニューアルしたので、それに対応しました。今回より.NET Framework 4.0専用になりましたので(今までは3.5)、もし動かなくなった！とかの場合は、.NET Framework 4.0をインストールしてください。

最近はすっかり放置気味ですみませんでした、わざ]]></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がリニューアルしたので、それに対応しました。今回より.NET Framework 4.0専用になりましたので(今までは3.5)、もし動かなくなった！とかの場合は、.NET Framework 4.0をインストールしてください。</p>

<p>最近はすっかり放置気味ですみませんでした、わざわざブログのコメント欄に報告頂いたものもスルーしていて、大変申し訳ありません。ええと、一応、今回プログラムを少し見直しまして、最近絶不調にエラーばっかだったと思うのですが、若干改善されたのではかと思います。</p>

<p>あと、リニューアルにともない、内部がかなり変わったんですが「全然テストしてない」ので、動作がヘンテコな可能性は大いにあります。変なとこあったら報告していただけると助かります。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/11/13_353.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Reactive Extensionsで前後の値を利用する</title>
		<link>http://neue.cc/2011/11/09_352.html</link>
		<comments>http://neue.cc/2011/11/09_352.html#comments</comments>
		<pubDate>Wed, 09 Nov 2011 12:30:28 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

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

		<guid isPermaLink="false">http://neue.cc/2011/11/09_352.html</guid>
		<description><![CDATA[@Toya256tweetさんの作成されたDependency Variable Libを見て、ReactivePropertyでも大体再現できるかなあ、でもOldValueとNewValueのところが少し面倒なのよね、というところで一例。ReactivePropertyの値の変更時に、古い値と新しい値を同時に得られるようにします。


var p = new ReactiveProperty&#60;int&#62;&#40;1, mode: ReactivePropertyMode.RaiseLatestValueOnSubscribe&#41;;
&#160;
p.Zip&#40;p.Skip&#40;1&#41;, &#40;Old, New&#41; =&#62; new &#123; Old, New &#125;&#41;
    .Subscribe&#40;a =&#62; Console.WriteLine&#40;a.Old + &#34; -&#62; &#34; + a.New&#41;&#41;;
&#160;
p.Value = 10; // 1 -&#62; 10
p.Value = 100; // 10 -&#62; 100


挙動は@okazukiさんの]]></description>
			<content:encoded><![CDATA[<p><a href="https://twitter.com/#!/toya256tweet">@Toya256tweet</a>さんの作成された<a href="http://dependencyvariable.codeplex.com/">Dependency Variable Lib</a>を見て、<a href="http://reactiveproperty.codeplex.com/">ReactiveProperty</a>でも大体再現できるかなあ、でもOldValueとNewValueのところが少し面倒なのよね、というところで一例。ReactivePropertyの値の変更時に、古い値と新しい値を同時に得られるようにします。</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> p <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, mode<span style="color: #008000;">:</span> ReactivePropertyMode.<span style="color: #0000FF;">RaiseLatestValueOnSubscribe</span><span style="color: #000000;">&#41;</span>;
&nbsp;
p.<span style="color: #0000FF;">Zip</span><span style="color: #000000;">&#40;</span>p.<span style="color: #0000FF;">Skip</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>, <span style="color: #000000;">&#40;</span>Old, <span style="color: #008000;">New</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> <span style="color: #000000;">&#123;</span> Old, <span style="color: #008000;">New</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span>
    .<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>a <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>a.<span style="color: #0000FF;">Old</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; -&gt; &quot;</span> <span style="color: #008000;">+</span> a.<span style="color: #008000;">New</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
p.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">10</span>; <span style="color: #008080; font-style: italic;">// 1 -&gt; 10</span>
p.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">100</span>; <span style="color: #008080; font-style: italic;">// 10 -&gt; 100</span></pre></div></div>


<p>挙動は<a href="http://d.hatena.ne.jp/okazuki/20111109/1320817437">@okazukiさんの解説されている</a>通りです。残念ながら、頭やわらかい、というわけではなくて頻出パターンのイディオムなだけなので、ただたんに覚えているから、というだけです、がくり。まあ、LINQにせよRxにせよ、メソッドの組み合わせで成り立っているということは、パターン化しやすいということなのですね。イディオムを知っていればいるほど、更にそのイディオムを組み合わせて、と、手法は無限に広がっていきます。</p>

<p>私は非同期をvoidにしてモデル作り込むっての好きくないです。IObservableなりTaskなりを返してくれれば、先があるのですが、そうでないとやりようがないですから。例えば<a href="http://d.hatena.ne.jp/okachimachiorz/20111010/1318250533">データモデル考え中 - 急がば回れ、選ぶなら近道</a>で示される「2」のパターンが、Silverlightなどでの従来のやり方だったと思われます。実行のトリガーだけを外から渡して、モデルの中で結果は閉じる。変更はINotifyPropertyChanged経由で通知。正直言って、私はこのやり方はナシだと思っています。スパゲティになりがちだから。Rxは「3」のパターンに近いと思います。順序の制御は、まさにミドルウェア足るReactive Extensionsが保証する。柔軟性は見ての通りで、無限の広がりがあります。</p>

<p>今まではコールバックしかなかったので必然的に2に収まらざるを得なかったですが、今はRxもあるし、C#5.0からはawaitもあるし、なので、モデルの作り方も「変わっていく」と思います。Viewの機能の強さによってViewModelのありようが変わるように、言語やフレームワークの機能の強さによってModelのありようが変わるのは当然でしょう。</p>

<h2>ScanとPairwise</h2>

<p>さて、自分自身と結合というのは、結局のところ二つ購読しているということなので、これはIObservableがHotでないと成り立ちません(ReactivePropertyはHotです)。というわけで、ColdなIObservableでも対応したい時はScanを使うといいでしょう。HotとかColdとか何言ってるのか分からないという場合は<a href="http://d.hatena.ne.jp/okazuki/20111107/1320677760">Reactive Extensions再入門 その５「HotとCold」 - かずきのBlog@Hatena</a>を読むといいでしょう。最近、自分で解説してるのを放棄しだしてる気がするよくない傾向、ではなくて、次回の<a href="http://www.atmarkit.co.jp/fdotnet/introrx/index/index.html">Reactive Extensions（Rx）入門 － ＠IT</a>ではまさにObservable.TimerとフツーのTimerを使ってColdとHotの解説しようと思ってたのですよ！ネタ被った、けれど気にせず書きます:)</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #FF0000;">var</span> p <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, mode<span style="color: #008000;">:</span> ReactivePropertyMode.<span style="color: #0000FF;">RaiseLatestValueOnSubscribe</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #FF0000;">var</span> oldNewPair <span style="color: #008000;">=</span> p.<span style="color: #0000FF;">Scan</span><span style="color: #000000;">&#40;</span>Tuple.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span>0, 0<span style="color: #000000;">&#41;</span>, <span style="color: #000000;">&#40;</span>t, x<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> Tuple.<span style="color: #0000FF;">Create</span><span style="color: #000000;">&#40;</span>t.<span style="color: #0000FF;">Item2</span>, x<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">Skip</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>;
&nbsp;
oldNewPair.<span style="color: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#41;</span>;
&nbsp;
p.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">10</span>; <span style="color: #008080; font-style: italic;">// (1, 10)</span>
p.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">100</span>; <span style="color: #008080; font-style: italic;">// (10, 100)</span></pre></div></div>


<p>Scanは自分自身の前の値を参照できるので、色々と応用が効きます。値の入れ物のための初期値は不要なのでSkip(1)で除去してやるのがポイント。</p>

<p>もう一つ、メソッドの組み合わせでのパターン化、というのは、つまりパーツ化しやすいということでもあります。拡張メソッドに分離してやりましょう。</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> ObservablePairwiseExtensions
<span style="color: #000000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// OldNewPair&lt;T&gt;はReactivePropertyに入っています</span>
    <span style="color: #008080; font-style: italic;">// using Codeplex.Reactive.Extensions;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">static</span> IObservable<span style="color: #008000;">&lt;</span>OldNewPair<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;&gt;</span> Pairwise<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> IObservable<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> source<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> source.<span style="color: #0000FF;">Scan</span><span style="color: #000000;">&#40;</span>
                <span style="color: #008000;">new</span> OldNewPair<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">default</span><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span>, <span style="color: #0600FF;">default</span><span style="color: #000000;">&#40;</span>T<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>,
                <span style="color: #000000;">&#40;</span>pair, newValue<span style="color: #000000;">&#41;</span> <span style="color: #008000;">=&gt;</span> <span style="color: #008000;">new</span> OldNewPair<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span>pair.<span style="color: #0000FF;">NewItem</span>, newValue<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>
            .<span style="color: #0000FF;">Skip</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</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> IObservable<span style="color: #008000;">&lt;</span>TR<span style="color: #008000;">&gt;</span> Pairwise<span style="color: #008000;">&lt;</span>T, TR<span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span> IObservable<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> source, Func<span style="color: #008000;">&lt;</span>T, T, TR<span style="color: #008000;">&gt;</span> selector<span style="color: #000000;">&#41;</span>
    <span style="color: #000000;">&#123;</span>
        <span style="color: #0600FF;">return</span> source.<span style="color: #0000FF;">Pairwise</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>x <span style="color: #008000;">=&gt;</span> selector<span style="color: #000000;">&#40;</span>x.<span style="color: #0000FF;">OldItem</span>, x.<span style="color: #0000FF;">NewItem</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: #008080; font-style: italic;">// ↑というような拡張メソッドを作ってやったとして</span>
<span style="color: #FF0000;">var</span> p <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</span>, mode<span style="color: #008000;">:</span> ReactivePropertyMode.<span style="color: #0000FF;">RaiseLatestValueOnSubscribe</span><span style="color: #000000;">&#41;</span>;
&nbsp;
p.<span style="color: #0000FF;">Pairwise</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>x <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>x.<span style="color: #0000FF;">OldItem</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; -&gt; &quot;</span> <span style="color: #008000;">+</span> x.<span style="color: #0000FF;">NewItem</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
p.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">10</span>; <span style="color: #008080; font-style: italic;">// 1 -&gt; 10</span>
p.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">100</span>; <span style="color: #008080; font-style: italic;">// 10 -&gt; 100</span></pre></div></div>


<p>OldNewPairを使ったのは、TupleがSL/WP7にないから、というのと、OldItemとNewItemというプロパティ名に意味があって、分かりやすいから、です。基本的にC#でTupleを使うことはあんまないですね。LINQのパイプライン内でならば匿名型、それを超えるなら面倒くさくてもクラスを立ててあげたほうがいいと、私は思っています。勿論、今後Tupleのための構文やパターンマッチが入るとしたら別ですけど。というか、つまるところ専用構文がない状態ではTupleを使うメリットはそんなにないのです。匿名型かわいいよ匿名型。言語比較の際に、<a href="http://d.hatena.ne.jp/ymotongpoo/20111105/1320506449">C#はTupleがこんな腐ってるぜー</a>、とかやられるのはちょっと勘弁願いたいところ(まぁでも普通に敵いませんのは認めます、けれど言語・IDE・フレームワークは三位一体だとも思っています。引き離して単独で評価することには、あまり価値を感じません。IDEでうまく機能することを優先した言語、それを前提にしたフレームワーク。どの要素も引き離せませんから。はいはい、C#がお好きなんですね、という感じですが、でも例えばHTML/ブラウザというGUIフレームワークの上だったらJavaScriptがベストだ、といった捉え方でもありますね)</p>

<p>それはともかくとして、Pairwiseは多用しそうなので、次のReactiveProperty(ver.0.3)で入れたいと思います(あとOldNewPairのToStringのオーバーライド)。ちなみに<a href="http://linqjs.codeplex.com/">linq.js - LINQ for JavaScript</a>にはPairwise、入ってます。そう、Rxでの頻出パターンということは、それはIx(Enumerable)にも存在するパターンなのです。この辺がRxの面白いところです！私にとって、こういった書き方の初出は<a href="http://d.hatena.ne.jp/NyaRuRu/20090311/p1">前後の値も利用したシーケンス処理 - NyaRuRuの日記</a>でした。</p>

<h2>ObserveChanged</h2>

<p>突然出てきたOldNewPairですが、これが既にReactiveProperty内で定義されているのは、ObservableCollectionの拡張メソッド群で使用しているからです。今まで紹介していなかったと思うので、ここで紹介しましょう。</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.Reactive.Extensionsとすると</span>
<span style="color: #008080; font-style: italic;">// ObservableCollection&lt;T&gt;に(ReactiveColelctionとか継承したものでも可)</span>
<span style="color: #008080; font-style: italic;">// ObserveXxxChangedという拡張メソッドが利用できる</span>
<span style="color: #FF0000;">var</span> collection <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ObservableCollection<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #008080; font-style: italic;">// 追加されたのを監視できる、IObservable&lt;T&gt;</span>
collection.<span style="color: #0000FF;">ObserveAddChanged</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>x <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Add:&quot;</span> <span style="color: #008000;">+</span> x<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #008080; font-style: italic;">// 削除されたのを監視できる、IObservable&lt;T&gt;</span>
collection.<span style="color: #0000FF;">ObserveRemoveChanged</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>x <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Remove:&quot;</span> <span style="color: #008000;">+</span> x<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #008080; font-style: italic;">// 置換を監視できる、IObservable&lt;OldNewPair&lt;T&gt;&gt;</span>
collection.<span style="color: #0000FF;">ObserveReplaceChanged</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>p <span style="color: #008000;">=&gt;</span> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>p.<span style="color: #0000FF;">OldItem</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot;→&quot;</span> <span style="color: #008000;">+</span> p.<span style="color: #0000FF;">NewItem</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #008080; font-style: italic;">// リセットを監視できる、IObservable&lt;Unit&gt;</span>
collection.<span style="color: #0000FF;">ObserveResetChanged</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> Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Clear&quot;</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
collection.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// Add:100</span>
collection.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1000</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// Add:1000</span>
collection<span style="color: #000000;">&#91;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">300</span>; <span style="color: #008080; font-style: italic;">// 1000→300</span>
collection.<span style="color: #0000FF;">Remove</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// Remove:100</span>
collection.<span style="color: #0000FF;">Clear</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// Clear</span></pre></div></div>


<p>この手の監視では、通常CollectionChangedイベント経由でNotifyCollectionChangedEventArgsを使って値を取り出すわけですが、型がobject[]なので一々キャストしたりなど、非常に使いにくいと思っていました。ObserveXxxChangedを使えば、完全にタイプセーフで、値も取り出しやすい形に整形してくれています。是非是非どうぞ。</p>

<h2>まとめ</h2>

<p>@Toya256tweetさんにも示唆頂いたのですが、ReactivePropertyはMVVMに限定されない、汎用的なものだと考えています。値の導出ルールを宣言的に書く、というのは色々なところで使える、気がします。でもやはり、Functional Reactive Programmingが全然流行ってないことを考えても、ルールによって自動的に変動する値って、基本的にGUI向けなのだろうなあ、って。そして、GUIで強いのはやっぱJavaとか.NETといったFRP不毛地帯なので、流行るなんて考えられないことでした。しかし、今は違う。C#にはRxが来た。C#で実現できるのならば、強力なGUIプラットフォームが目の前にあるわけなので、かなり可能性はあるんじゃないかな！と思いたいところです。</p>

<p><a href="http://www.kmonos.net/wlog/83.html#_2259080315">d.y.d. - ReaJ / Reactive JavaScript</a>の例は</p>


<div class="wp_syntax"><div class="code"><pre class="csharp csharp" style="font-family:Consolas,monospace;"><span style="color: #008080; font-style: italic;">// RaiseLatestValueOnSubscribeはv0.3ではデフォルトに変更する予定</span>
<span style="color: #FF0000;">var</span> mode <span style="color: #008000;">=</span> ReactivePropertyMode.<span style="color: #0000FF;">RaiseLatestValueOnSubscribe</span>;
&nbsp;
<span style="color: #FF0000;">var</span> x <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">int</span><span style="color: #008000;">&gt;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">10</span>, mode<span style="color: #000000;">&#41;</span>;
<span style="color: #FF0000;">var</span> y <span style="color: #008000;">=</span> x.<span style="color: #0000FF;">Select</span><span style="color: #000000;">&#40;</span>n <span style="color: #008000;">=&gt;</span> n <span style="color: #008000;">+</span> <span style="color: #FF0000;">100</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToReactiveProperty</span><span style="color: #000000;">&#40;</span>mode<span style="color: #008000;">:</span> mode<span style="color: #000000;">&#41;</span>;
x.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">20</span>;
x.<span style="color: #0000FF;">Value</span> <span style="color: #008000;">=</span> <span style="color: #FF0000;">30</span>;
Console.<span style="color: #0000FF;">WriteLine</span><span style="color: #000000;">&#40;</span>y.<span style="color: #0000FF;">Value</span><span style="color: #000000;">&#41;</span>; <span style="color: #008080; font-style: italic;">// 130</span></pre></div></div>


<p>まあ、不格好です。ReactiveProperty用の専用構文でも用意してくれないとね、rp x = 10; rp y = x + 100; とかで上記の形に整形されたら素敵なのですが。というのはともかくとして、一応、実現できています。GUI環境への反映はWPFのバインディング機構に投げて解決ですし。JavaScriptにおいても、ReactivePropertyを移植して、ベースとして<a href="http://knockoutjs.com/">Knockout.js</a>辺りを採用すればいい感じに実用的になりそうです。その辺は追々やっていきたいところ。</p>

<p>勿論、Rx自体の可能性はGUI(や非同期)だけに閉じているわけではないので、全く別なところでの可能性、使い道というのも追い求めていきたいです。</p>

<p>ともあれともかく、<a href="http://reactiveproperty.codeplex.com/">ReactiveProperty</a>、試してみてくださいな。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/11/09_352.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Rx連載開始とRx本感想とZenbook買ったという話</title>
		<link>http://neue.cc/2011/11/07_351.html</link>
		<comments>http://neue.cc/2011/11/07_351.html#comments</comments>
		<pubDate>Mon, 07 Nov 2011 12:54:44 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[Computer/Audio]]></category>

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

		<guid isPermaLink="false">http://neue.cc/2011/11/07_351.html</guid>
		<description><![CDATA[まーたブログを放置気味な昨今は大変よろしくなく、だらだらTwitterを眺めているだけで一日が終わる症にかかっています。さて、そんなわけですが、@ITにてRx入門の連載を開始しました。


Reactive Extensionsの概要と利用方法 － ＠IT


導入なので]]></description>
			<content:encoded><![CDATA[<p>まーたブログを放置気味な昨今は大変よろしくなく、だらだらTwitterを眺めているだけで一日が終わる症にかかっています。さて、そんなわけですが、@ITにてRx入門の連載を開始しました。</p>

<ul>
<li><a href="http://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01_01.html">Reactive Extensionsの概要と利用方法 － ＠IT</a></li>
</ul>

<p>導入なので細かいことは言わず、なんか凄そう！と思ってもらえればいいなー、という構成にしました。用語もそんな並べず、でも、ところどころ引っかかるワードがある、言い方を悪くするとハッタリ気味に、印象に残ってくれればいいなあ、と。初回とはいえ、導入だけであっさり終わってしまったのはちょっと反省。どんな形になるのかイマイチ掴めなくて、もう少し書けばよかったな、と思ってます。あと、図をもう少し入れるべきだったな、と……。そんなこんなな反省を生かし、次回はボリューム増でお送りします。</p>

<p>@okazukiさんが<a href="http://d.hatena.ne.jp/okazuki/20111031/1320072227">Reactive Extensiions再入門</a>を始めたり、@zoetroさんが<a href="http://d.hatena.ne.jp/ZOETROPE/20111031#1320077799">Rx-Testingについて詳しい記事</a>を書かれていたり(これは素晴らしい！)、Rxも盛り上がってきた感じがしますね！それは気のせいです。というだけで終わらせないよう、ガンガン行きましょうー。</p>

<h2>Rx本</h2>

<p>(やっと)発売されました。まず印象ですが、薄いです。私は電子書籍で買っちゃってるのでリアルな厚さは分からないんですが、180ページです。それでこの値段かよ、という不満を最初は持ってしまうかもしれません。あと、LINQ and Rxです。どういうことかというと中身の半分はフツーのLINQの話です。それを差っ引くとRxは90ページしかありません。更にRxJSやReactiveUIの話もあります。そこを差っ引くと50ページぐらいしかないじゃないかゴルァ。というわけで、Rx本として考えると、分量には不満が残ると思われます。全てのメソッドをカバーする、という内容でもないのでリファレンスとしても使えません。</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=1430237473" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>とはいえ、要素要素は満遍なくカバーできているのと、現在唯一のRx本ではあるので、本で学びたいなあ、と思うならこれしか選択肢はありません。WindowやJoin、Testingなんかは（私の怠慢により）このブログでは少しも紹介していないので、それらを知りたい方や、 Web上から断片的な情報を拾って組み上げるのは手間なので、購入するのは十分アリだとは思います。まあ、私の@IT連載が完了したら、第一の選択肢はそれを見ること、になります(ｷﾘｯ。となれるように、頑張ります。</p>

<h2>ASUS Zenbook UX31</h2>

<p>どうでもいいんですが、UX31を買いました。Intelの推奨するUltrabookの第一弾の中では大本命の一品です。さて、Ultrabookとは何か、というと、ようするところWindows版Macbook Airです。薄く軽く速い。宗教上の理由で林檎はお断りだ！な人にとっては救いの手なわけです。内心羨ましいとか思ってたりしたんだからね！しかしですよ、Win系の勉強会ではそうでもないですが、それ以外の勉強会でのMac率の高さといったら！会場の9割がMacだよ、とかドヤ顔でツイートされた日には！多様性は善、はどこに行ったんだよという話です。</p>

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

<p>側面は、実用的な意味ではフルフラットのほうが良いのでしょうし、特に日本メーカーはそこに拘っている印象があるのですが、審美的にはこうした処理をしたほうがいいですね、視覚上のトリックとはいえ、圧倒的に薄く見えるので。ちなみに側面から見ると本当にMacbook Airソックリでパク……と口から出てしまうのも已むを得ないかな、とは思いますが、それ以外の部分はそんなに似てるわけでもないですよ。</p>

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

<p>ZenbookはSSDがSATA 3.0（6Gbps）ということもあって、滅茶苦茶速いですね。今後はこの速度がスタンダードになっていくのかと思うと、いい時代です、ほんと。</p>

<p>その他の印象ですが、キーボードはまぁまぁ、タッチパッドはサイテー。タッチパッドはキー入力中の誤動作率の高さ(位置とか大きさが悪いのだろうなあ)も酷くてストレスフル。基本はマウス使いますけれど、いつもマウス持ち歩くのもねえ。ああ、あと、UX31はUltrabookの中で唯一解像度が1600&#215;900と高い(他は1366&#215;768)のがポイントです。フルHDじゃないのかよ！とVAIO Zのオーダーメイドな人が言ってくるかもしれませんが、まぁVAIO Zは店頭モデルはともかくフルHDでオーダーすると高いですからね。こっちは10万円なのでコストパフォーマンスが違うわけです、はい。あと、13インチで1600&#215;900は程良いですよ。フルHDだとちょっと文字が細かすぎになる感も。</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=B005YWPI7O" 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=B005YWPJLE" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>

<p>総じて満足度は高くお薦めなので、是非買ってください(上のリンク先から！)</p>

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

<p>悲しいことに私はいきなりACアダプタのコネクタを破壊してしまって充電不能に陥りました、ｵｩﾉｩ。地震で物が降ってきてですね。脆いものです。</p>

<p>追記：ASUSのサポートセンターに連絡し、交換してもらいました。非常に対応もよかったので、全然問題ないです。ネガティブな方向でURLがばら蒔かれてしまって想定外だったのですが、全然大丈夫ですよ、とは書いておきます。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/11/07_351.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Chaining Assertion ver1.6.1.0</title>
		<link>http://neue.cc/2011/10/24_350.html</link>
		<comments>http://neue.cc/2011/10/24_350.html#comments</comments>
		<pubDate>Mon, 24 Oct 2011 14:42:47 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://neue.cc/2011/10/24_350.html</guid>
		<description><![CDATA[
Chaining Assertion - Codeplex


Chaining Assertionとは、メソッドチェーンな形で簡単にユニットテストを書けるようにする拡張メソッドです。何でそういうのが必要なのか、とかの理由などはneue cc - テストを簡単にするほんの少しの拡張メソッドで。

最近こっそり小さ]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://chainingassertion.codeplex.com/">Chaining Assertion - Codeplex</a></li>
</ul>

<p>Chaining Assertionとは、メソッドチェーンな形で簡単にユニットテストを書けるようにする拡張メソッドです。何でそういうのが必要なのか、とかの理由などは<a href="http://neue.cc/2010/08/02_270.html">neue cc - テストを簡単にするほんの少しの拡張メソッド</a>で。</p>

<p>最近こっそり小さな更新が続いているのですが、今回の更新は、IsNullにmessageが指定できるようになりました。実のところ、他のIsは指定できたのですが、IsNullだけ指定不可能でした。理由はただたんに忘れてたから、です。とてもしょうもない……。と、@okazukiさんに<a href="http://d.hatena.ne.jp/okazuki/20111022/1319257560">ChainingAssertion使ってみた</a>で指摘頂きました。いやあ、ありがとうございます。</p>

<p>そんなこんなで見直していて、そういえば params object[] parameters なオーバーロードが欠けてるなあ、入れたほうがいいかしらん、と少し実装初めてからやめました。やりたければstring.Format使ってください、はい。ちなみに理由はオーバーロードが必要(messageのほうに{}が入っていてparametersは空、というケースを避けるため、paramsとはいえ別のオーバーロードを用意する必要がある)だからです。</p>

<p>オーバーロードは減らしたいんです。少ないほうが分かりやすいというのは自明な話だと思います。使いやすいAPIのためには、クラスの数を減らそう、メソッドの数を減らそう、オーバーロードの数を減らそう、引数の数を減らそう。少ないことは美です。それでですね、メソッド数を減らすためもあって、Isはかなりオーバーロード嵩んでいるのですよね。だから、瑣末な機能を追加するためだけにホイホイとオーバーロードは足せません。</p>

<h2>その他</h2>

<p>@shinsukeodaさんに<a href="http://d.hatena.ne.jp/odashinsuke/20111005/1317813807">ChainingAssertion for MSTest のパラメタライズドテストを NUnit 感覚で利用すると… </a>で紹介頂き本当にありがとうございます。本題の、パラメタライズドテストについてですが、これが非常に悩ましい。実装的にビミョーになってしまう、というのもそうなのですが、NUnitは本当のパラメタライズドテストで、テストケースがバラバラになるのですが、ChainingAssertionのものは擬似的なものに過ぎないので、テスト結果的には一つのテストケースなのですね。そして、一つのケースなのにInitializeやCleanupを呼んでいく、という挙動がアリなのかナシなのかが、自分のなかで答えがでないのです。なので、今はちょっと見送りです。もう少し考えて答えが出たら、その時に、かしらん。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/10/24_350.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>ReactiveProperty ver.0.2.0.0</title>
		<link>http://neue.cc/2011/10/17_349.html</link>
		<comments>http://neue.cc/2011/10/17_349.html#comments</comments>
		<pubDate>Mon, 17 Oct 2011 13:32:36 +0000</pubDate>
		<dc:creator>neuecc</dc:creator>
		
		<category><![CDATA[C#]]></category>

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

		<guid isPermaLink="false">http://neue.cc/2011/10/17_349.html</guid>
		<description><![CDATA[
ReactiveProperty - MVVM Extensions for Reactive Extensions


ver.0.2！ご意見ご感想は随時募集中で、コメントなりTwitterで私に@を投げてくれるなり、ただたんにTwitterでReactivePropertyと含めてつぶやいてくれるなり(検索経由で拾えるので)、ブログで記事を書いてくださるついでにクエスチョンしてみたりなどな]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://reactiveproperty.codeplex.com/">ReactiveProperty - MVVM Extensions for Reactive Extensions</a></li>
</ul>

<p>ver.0.2！ご意見ご感想は随時募集中で、コメントなりTwitterで私に@を投げてくれるなり、ただたんにTwitterでReactivePropertyと含めてつぶやいてくれるなり(検索経由で拾えるので)、ブログで記事を書いてくださるついでにクエスチョンしてみたりなどなど、ちょっとした疑問でも要望でも、何でもどうぞ。特に、細かな使用感の向上というのはリクエストがあってこそですので！斜め上からやってきた結果として世界最先端(但し逆向き)を体感出来るのは今だけです！斜め上なのでReactivePropertyのうまい使い方は今のところ誰にも分かりません、私もわかりません(えー)。というわけで、みんなで模索できたらいいな、と思います。</p>

<p>国内はもとよりReactiveUIの作者からも言及頂いて結構褒めてもらったりなどなど、RxのForumで宣伝したかいがあったね！というわけで、私自身かなり真剣に取り組んでますので、付き合って頂ければ幸いです。 /* 現在ReactiveOAuthをほっぽりだしてるという信頼感のなさがアレなので、そちらも早めに何とかします…… */</p>

<p>今回は、0.1では中途半端な存在だったReactiveCollectionを徹底的に考察して再デザインしました。他に細かい追加が幾つか。まずは小さな追加から。</p>

<h2>追加したり変わったりしたもの</h2>

<p>ObserverPropertyが、最初のSubscribe時に値をPushするようになりました(引数でfalseを指定するとオフにも出来る、そうすると、普通にFromEventしたのと同じ)</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> ToaranaiViewModel
<span style="color: #000000;">&#123;</span>
    ToaruModel model;
    <span style="color: #0600FF;">public</span> ReactiveProperty<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> Name <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> ToaranaiViewModel<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;">// こんなINotifyPropertyChangedなModelがあるとして</span>
        model <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ToaruModel <span style="color: #000000;">&#123;</span> Name <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;Anders&quot;</span> <span style="color: #000000;">&#125;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 初期値として現在値(この場合&quot;Anders&quot;)を持つ</span>
        Name <span style="color: #008000;">=</span> model.<span style="color: #0000FF;">ObserveProperty</span><span style="color: #000000;">&#40;</span>x <span style="color: #008000;">=&gt;</span> x.<span style="color: #0000FF;">Name</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToReactiveProperty</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>
&nbsp;
<span style="color: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ToaruModel <span style="color: #008000;">:</span> INotifyPropertyChanged
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">private</span> <span style="color: #FF0000;">string</span> name;
    <span style="color: #0600FF;">public</span> <span style="color: #FF0000;">string</span> Name
    <span style="color: #000000;">&#123;</span>
        get <span style="color: #000000;">&#123;</span> <span style="color: #0600FF;">return</span> name; <span style="color: #000000;">&#125;</span>
        set <span style="color: #000000;">&#123;</span> name <span style="color: #008000;">=</span> value; PropertyChanged<span style="color: #000000;">&#40;</span><span style="color: #0600FF;">this</span>, <span style="color: #008000;">new</span> PropertyChangedEventArgs<span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;Name&quot;</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;">event</span> PropertyChangedEventHandler PropertyChanged <span style="color: #008000;">=</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: #000000;">&#125;</span>;
<span style="color: #000000;">&#125;</span></pre></div></div>


<p>これにより、既存のModelからToObservablePropertyしてViewModelにする際などに、デフォルトで値が同期されるので多くのシチュエーションで、より便利になったと思います。という提案を@okazukiさんにリクエスト貰ったので実装しました:) @okazukiさんは<a href="http://d.hatena.ne.jp/okazuki/20111017/1318827792">ReactivePropertyを使ってみた感想 イケテル！気持ちいい！ハードルは高い？ - かずきのBlog@Hatena</a>という記事も書いてくれました、わーい。</p>

<p>ObserverProeprtyはINotifyPropertyChangedへの拡張メソッドです。また、今回よりINotifyPropertyChangingにObservePropertyChanging拡張メソッドを追加しました。ObserverProeprtyと同様な感覚で使えます。</p>

<p>それとReactiveCommand(無印)のExecuteが引数なしでnullをぶん投げるようになりました。なお、これがあるのは無印のほうのみで&lt;T>のほうにはありません。だって、ジェネリックするということはパラメータが欲しい前提ですものね。ジェネリックのほうはExecute(T parmeter)を受け入れるうようにオーバーロードを隠蔽。こういう細かいところの使いやすさの向上ってのは随時取り組みたいところです。</p>

<p>また、ReactiveCommand(無印・ジェネリック共に)をDisposeすると、SubscribeしてたものにOnCompletedを投げるように変更しました。なお、ReactiveCommandをDisposeすると、CanExecuteもfalseになります。永久的にfalseにする、という意味合いで使えるかと思いますが、使うシチュエーションは分かりません。</p>

<h2>ReactiveCollectionの再デザイン</h2>

<p>ReactiveCollectionに大きめの変更を入れました。今まで通知をIScheduler上で行なっていましたが、これを廃止しました。かわりにToReactiveCollectionなどIObservableからの変換時は、Addと通知、両方をIScheduler上にしました。また、IScheduler上で各種操作(Add, Clear, Remove)を行うメソッド AddOnScheduler などを追加しました。この変更のデザイン上のポリシーは以下になります。</p>

<p>ObservableCollectionとスレッドセーフ・ディスパッチャーセーフというのは非常に難しい。まず、ObservableColectionは変更と通知がワンセットだと考えられる。コレクションが変更され通知を出し、通知され側(主にUI)がコレクションを読みに来る。これは全部ひとまとまりでなければならない。通知され側がコレクションを読みに行く際に、ズレがあってはならない。よって、通知をUIスレッドで行うなら、変更もUIスレッドで行われる必要がある。</p>

<p>しかし、全ての操作を内部で片っ端からDispatcherにBeginInvokeするアプローチを取ると、それはそれで都合が悪い。例えば別スレッドでAddしたりRemoveしたりClearしても、そのコード上では変更はすぐには反映されない。ClearしてもCountは変わらない。AddしてもCountは変わらない。そんな気味の悪いコレクションクラスは使えません。WPFではDispatcher.Invokeがあるので、変更と通知を強制的にUIスレッド上で行う、ということが可能でしたが、SilverlightにはBeginInvokeしかないので、操作をUIスレッドで行うことを保証するコレクションクラスの作成は不可能。(<a href="http://caliburnmicro.codeplex.com/">Caliburn Micro</a>のBindableCollectionは全部UIスレッド上で行うようにしているみたいですね、まあBindableにのみ焦点を当てるなら現実的なので、それはそれでいいと思います)</p>

<p>だから、コレクションを触る時は利用側がDispatcher.BeginInvokeして、明示的にDispatcherの中へ入ろう。というのが、整合性が取れて一番良いのだと思います。今まで、ReactiveCollectionは通知だけIScheduler上で行うようになっていました。でも、これはあまり良いデザインではない、操作と通知は同一スレッド上で行うべきなのだから、これでは乖離する可能性がある。単純なAddだけのようなケースでは問題になることは少ないし、利便性としては、その方が簡単にバインドで出来て良いよね、ではあるのだけど、決して良いデザインではない。いずれ発覚する破綻への気づきを遅らせているという点で、むしろ限りなく悪い。</p>

<p>よって、内部で片っ端からDispatcherにBeginInvokeする代わりに、AddOnSchedulerなど、(ReactiveCollection生成時に指定した/デフォルトはUIDispatcher)スケジューラ上で操作を行うと利用側が明示するアプローチを取ってみました。Rxには使い勝手の良いISchedulerが存在する。だからこそアリなやり方かな、と思います。この辺はまだまだ考えどころだと思いますので、ご意見ありましたらお願いします。</p>


<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;Grid<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ListBox</span> <span style="color: #000066;">ItemsSource</span>=<span style="color: #ff0000;">&quot;{Binding TimeItems}&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/Grid<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: #0600FF;">public</span> <span style="color: #FF0000;">class</span> ToaruViewModel
<span style="color: #000000;">&#123;</span>
    <span style="color: #0600FF;">public</span> ReactiveCollection<span style="color: #008000;">&lt;</span><span style="color: #FF0000;">string</span><span style="color: #008000;">&gt;</span> TimeItems <span style="color: #000000;">&#123;</span> get; <span style="color: #0600FF;">private</span> set; <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> ToaruViewModel<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;">// 1秒毎に現在時刻表示が追加されるコレクション</span>
        TimeItems <span style="color: #008000;">=</span> Observable.<span style="color: #0000FF;">Interval</span><span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">1</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>_ <span style="color: #008000;">=&gt;</span> DateTime.<span style="color: #0000FF;">Now</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: #0000FF;">ToReactiveCollection</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
&nbsp;
        <span style="color: #008080; font-style: italic;">// 5秒間隔で上記コレクションをクリアする</span>
        Observable.<span style="color: #0000FF;">Interval</span><span style="color: #000000;">&#40;</span>TimeSpan.<span style="color: #0000FF;">FromSeconds</span><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: #0000FF;">Subscribe</span><span style="color: #000000;">&#40;</span>_ <span style="color: #008000;">=&gt;</span> TimeItems.<span style="color: #0000FF;">ClearOnScheduler</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></pre></div></div>


<p>今回考えるにあたっては<a href="http://shinichiaoyagi.blogspot.com/2011/06/net-observablecollection.html">青柳 臣一 ブログ（技術系）: [.NET] スレッドセーフな ObservableCollection&lt;T&gt; が欲しい</a>をとっても参考にさせて頂きました。</p>

<p>ReactiveProperty, ReactiveCommandは確固たる意思のもとに作ったんですが、ReactiveCollectionは非常に中途半端でした。が、今回ようやく理念が立てれたのではかと思います。なお、ObservableCollection/ReactiveCollectionにはObserveAddChangedなど、変更通知をIObservableで受け取ることのできる拡張メソッドを足してあるので、そちらも便利に使うことが可能です(素のNotifyCollectionChangedEventArgsはIList(ジェネリックじゃない！)であったりして非常に触りにくいので、その辺をきっちり整理してあります)。</p>

<p>とか言ってますが、コードにしたらたかが十数行なのですよね。それを決めるのに、ここ一週間ずっと考えてました。つまり私の生産性は一日一行です(ｷﾘｯ</p>

<h2>まだ追加してないもの</h2>

<p>Validation周りをValidationSummaryやDescriptionViewerに対応させる。とか、OnErrorRetryが値を返せるようにする。などは次に載せるつもりです。これらを加えてから、と思ったんですがReactiveCollectionの変更が大きいので、先に出したくて見送りました。</p>

<h2>ReactiveProperty-Experimental</h2>

<p>今回からExperimental版のRxにも対応しました。NuGetでは<a href="http://nuget.org/List/Packages/ReactiveProperty-Experimental">ReactiveProperty-Experimental</a>です。しかし、
.NET 4.5やWinRTへの対応は、まだしていません。せっかくRx(Experimental)がWinRT対応したので、それに合わせたいと思ったのですが断念。理由としてはVS11がCode Contractsに対応していないから、です。Code Contractsのバイナリリライトかけないと動かないので、どうにもなりません……。それがなければ今すぐにでも対応させたいのですけれどねえ。こういう時に機敏に動けないのはとても悲しいので、次回からはCode Contractsの採用は見送りたいと思ってしまいます……。</p>

<p>ところで、それを意識してではありますが、.NET 4.0版のDLL名をReactiveProperty.NET40.dllに変えました。複数プラットフォームに対応する場合、全てのDLLを同じ名前にする(JSON.NETなどはそうですね)か、全てのDLLにプラットフォームの識別子をつける(MVVMLightなどはそうです)か。前者のほうがスマートではあるのですが、分かりやすさを考え、後者を選びました。Stable版とExperimental版の区別もありますし、DLL名から判定出来たほうがいいかな、と。</p>

<h2>今後</h2>

<p>okazukiさんの記事にもあるように「MVVMライブラリにも精通しつつReactive Extensionsのことも知っててReactivePropertyの概要を把握してないといけない上に必要に応じてMVVMライブラリとReactivePropertyを繋ぐような機能を作りこまないといけない」きゃー、難しそう！でも事実だ！</p>

<p>私としてはReactivePropertyを通してReactive Extensionsを学習してもらえればいいかなあ、と思っています。Rxはイベントが合成出来る！というけれど、合成しようにもイベントのソースがないと始まらない。ReactivePropertyを使うと、手軽に合成のためのソースが手に入るので、イベント周りのRxでのこね方の学習に最適なのではかと思います。……多分。</p>

<p>既存MVVMライブラリとの使い分けなどに関しては、この類の「選択肢が増えます系」の永遠の課題ですねえ。結局、どう使い分けるかの判断をユーザーに丸投げしているわけですもの。ガイドなどを掲示できればベストなのですが、そもそも私がMVVMに全然詳しくないのであった。そもそも私自身がどう使えばいいのか分かってないぐらいなので(えー)、触ってみて、ついでに足りなかったり、これがこうなってたらいい、とかいう思いがあったら、私がそういうのに全然気づいてない確率100%なので、是非言ってやってください。</p>
]]></content:encoded>
			<wfw:commentRss>http://neue.cc/2011/10/17_349.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>

