System.Reactiveの中身をほんのちょっと読んで見る。(その1)

Rxの中身をほんのちょっと読んで見る。

前々回にふと気になったのでRxのチェーンがどういう感じなのかなと思ってうんたららみたいな記事を書いたのですが、今度はちゃんとSystem.Reactiveの中身をちらっと読んでいきます。これらのソースコードはApache License, Version 2.0で提供されたものをコピペしたりしています。2,3回に分けて書きます。今回は拡張メソッドの

を起点にたどっていきます。

s_implはどちら様?

Select関数の中身を見るとこうなっています。

s_implとは一体…。別のファイルに定義されてますね。

IQueryLanguageにはこんな感じの定義がズラーーーっとされています。

intがあるやつはindexとかを返すselectorですね。
そんなことより、さっさと具象クラスを探します。

QueryServicesの方を実装を眺めてみます。

Type or member is obsoleteとか書いてあるけどとりあえずスルー。GetQueryImpl()はServices.Extend(defaultInstance)を返しています。ServicesはIQueryServicesで受け止められています。IQueryServicesにはどんな定義がなされているか見てみると、

なんとこれだけです。baseImplとか言ってるので実際に実装されたものが投げ込まれるっぽいですね。返り値もT,引数もT。ふむ。

実際のServicesを作っているのはInitialize()なので、中身をみると、PlatformEnlightenmentProviderからいろいろ生えているので、これを眺めます。

CurrentはCreatePlatformProvider()によって作られているそうですね。
呼び出されているCurrentPlatformEnlightenmentProviderクラスに飛びます。

なるほど。すこし前に示したQueryServicesクラスでは、.GetService()を呼び出していました。なのでGetService関数を追います。IQueryServicesはその他のインターフェースを実装されていないので、実際に処理が行われているのは入っていくのは

Debugger.IsAttachedで分岐してますね。コメントには

デバッガがオペレータを中断するときまで待つのではなく、デバッガがアタッチされているかをみてどうするかを決めていますと。それはデバッガが動的にインターセプションするよう切り替えるのが大変だからだと。たぶんそんな感じ。なので今回はデバッガはアタッチされていないということで(たぶんデバッグ用の工夫がなされていて複雑になっていそうなので)読んでいくこととします。
アセンブリ読みこんでdbg返してるようですが,明らかに追っかけづらい。
興味があるのは実際の挙動なのでシンプルな方がいい。というわけでここまで読んできたのですが、returnはnullらしいので、class QueryServicesのInitialize関数はDefaultQueryServicesクラスが渡されていることになります。Defaultっていってるし先にこっちから読めばよかったね()

DefaultQueryServicesクラスはQueryServicesクラスの直下に以下のように定義されています。

引数で渡されたものそのまま返しているだけっぽいという…。

なのでいろいろなものを省くと、s_implはこういうことだとわかります。

遠回りしたのがアホくさくなるくらいにはシンプルになる。ていうか名前から最初から割と明らか感がありますね。。。
QueryLanguageクラス、あちこちに実装が散らばっているのでおっかけづらいですが、とりあえずIQueryLanguageは実装されていることがわかります。なので上記で問題なさそうですね。ではその2で内部で使われているクラスやその役割を見ていきます。

neno

都内のJK大学生。趣味はドールと一緒にお出かけして撮影すること。C++とC#が好き。C++は主にリアルタイム画像処理, C#はUnity, WPF, UWP, .NET Coreとかいろいろ。ASPとXamarin学習中。 専攻はCV。最近のおもちゃはHoloLens。

あわせて読みたい

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

%d人のブロガーが「いいね」をつけました。