An Internal of LINQ to Objects

というタイトルで、大阪で開催された第3回 LINQ勉強会で発表してきました。

An Internal of LINQ to Objects from Yoshifumi Kawai

大阪は初めてですね!というか、東京以外で発表しに行くのは初めてです。大阪遠い。

レベル感は、まぁもうLINQも初出から10年も経つわけだし(経ってない)、もはや初心者向けもないだろうということで、LINQ to ObjectsのDeep Diveなネタを突っ込んでおきました。こんなにまとまってる資料は世界にもないですよ!なんで知ってるかというと、linq.jsの実装で延々と何回も書いてるからです、はい。いいことです。そのぐらいにはパーフェクトな実装ということで。ver.3の完成は、も、もう少し、ま、まだ……。ごめんなさい。近いうちには、またベータ出すよ!←いい加減完成させろ

口頭で捕捉した内容としては、yield returnで書くメソッドは引数チェック用のと分離させよう、というところ。これ、メンドーくさかったらやらなくていいです。実際メンドウクサイですしね。コアライブラリっぽい位置づけのものだったらがっつしやるのも良いとは思いますが、普段からやるのはカッタルイでしょう。と、いっても、LINQ以降はあまり生でyield return使うこともないでしょうけれど。

イテレータの話とかは、実際doudemoiiんですが、気になる人は、これはそもそもC#の言語仕様書に書いてあります。言語仕様書はVSインストールディレクトリの

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC#\Specifications\1041\CSharp Language Specification.docx

にあるので(日本語訳されてるよ!)、読んだことない人は眺めてみると楽しいんではかと思います。

Comment (4)

toshi : (12/16 23:50)

いつもここのブログで勉強させていただいています。
このブログでC#に興味を持ち、C#プログラマを目指して現在必死に勉強中です。

ご質問させていただきたいのですが
P18で
「runnning状態ではMoveNextの挙動は未定義なので、ThreadSafeではないけど、Enumerator自体はThreadSafe」の部分がよく理解できなかったのですが
MoveNextをrunning状態に連続で呼ばれると駄目ということなのでしょうか?
Enumerator自体はThreadSafeなので結果的に問題ないということですか?

もしよろしければご返事頂けると嬉しいです。

neuecc : (12/19 05:36)

おっと、返信遅れて失礼しました&どもです。

あー、ここは日本語が悪いですね、すみません、自分でも読み返して意味不明感あるというか、
このまま取ると全然正しくないですね……。
正しくはIEnumerableのGetEnumeratorメソッドがスレッドセーフで
IEnumeratorのMoveNextメソッドがスレッドセーフではない、です。

hoge : (12/19 10:58)

IEnumerableのGetEnumeratorをマルチスレッドで同時に呼んでも良いけ
ど、一度取得したIEnumeratorをマルチスレッドでMoveNextするのはダメよ
(ThreadSafeでない)ということでしょうか。

neuecc : (12/19 15:04)

はい、その通りです!

Name
WebSite(option)
Comment

Trackback(0) | http://neue.cc/2013/12/16_436.html/trackback

Search/Archive

Category

Profile


Yoshifumi Kawai
Microsoft MVP for Developer Technologies(C#)

April 2011
|
July 2021

Twitter:@neuecc
GitHub:neuecc
ils@neue.cc