オブジェクト初期化子とコレクション初期化子
なんだか LINQ to Object を使っていて、従来はごちゃごちゃした手続きだったものが、きれいな一つの写像を表現する式になったりするなぁと不思議に思ってたんですが、縁の下の力持ちが誰なのかわかりました。
オブジェクト初期化子とコレクション初期化子が LINQ を支える影の大黒柱だったんですね。
あまり意識してなかったけど、こいつらの効果は絶大で、こいつらがあってこそ LINQ が活用できてますね。
ちょっと褒めすぎかw でも、単なる短く書ける構文ってだけじゃなく、
- 初期化ということの範囲をコンストラクタからもうちょっとゆるやかに広げた
- 最初にも書いたけど、これによってごちゃごちゃした一連の手続きが一つの初期化を表す式にできる
- 式になったことで LINQ の中に組み込める
その結果、できあがった一つの式を改めて見ると、ごちゃごちゃした一連の手続きはつまるところ写像だった、みたいな抽象的な視点でコードが見えるようになるわけですな。
# コンバーターを使いこなしていれば従来でも達成できてたことなんだろうけど、ええうまく使えてませんよorz
関連ネタ。
id:NyaRuRu:20071230:p1 (すばらしすぎるエントリー。そして式であることの意味は使っているうちにじわじわとわかってきてます)
http://www.kmonos.net/wlog/81.html
(オブジェクト初期化子が広げた初期化の範囲と、stationary field で広げた「初期化処理中」と範囲が似てるなーとか。読み取り専用かどうかは別の話だけど。しかもオブジェクト初期化子は初期化中はよそから触れない → id:siokoshou:20071123:p1。C# にコンストラクタとオブジェクト初期化子だけで初期化を認める stationary フィールドを追加するのって簡単かも?あ、でも、ずっと後から初期化するフィールドは救えないか…却下ですねw)