わんくま東京#38 lt 「func と ref / out 小咄」

15
わわわわわわ わわわわわ #38 Func<> わ ref / out わわ ※わわわわわわわわわわわわわわ※ takeshik

Upload: takeshi-kiriya

Post on 28-May-2015

1.903 views

Category:

Technology


0 download

DESCRIPTION

@ わんくま同盟 東京勉強会 #38 - ライトニングトーク大集合!!

TRANSCRIPT

Page 1: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

Func<> と ref / out 小咄

※例によって強引な取り組みです※

takeshik

Page 2: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

自己紹介• 自称変態 C# プログラマ• MetaTweet は LINQ まみれどころではない• 真面目に書いてるつもりなんですけどねえ…• それ C# じゃないとか散々な言われようで

す• 最近式という概念の美しさに取り憑かれてます

•LINQ はメソッド形式で使ってこそでしょ!!

Page 3: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

私には嫌いなものがある!• ローカル変数が大嫌いです

– できれば、できるだけ使いたくない!– var かどうかとかそういう次元じゃない!

• その中で最も憎たらしいのは– 初期化を欠いた宣言を見ると憤りを感じる– 仕方なく書いてるんだからね!!!!!!!!!

int value; // ← これ!!int.Parse("1234", out value);              // ↑ こいつのせいで!!!

Page 4: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

私には最近興味を持つものがある!• 多値返却ってクールだよねー… ( はぁと

– 多値返却があれば ref とか out とかいらないんじゃね!?いらないって!!

• 忌々しいローカル変数宣言を滅ぼせる!!• よし!自分で多値返却もどきを作るぞ!!

– 関数オブジェクトに拡張メソッドぶち込んで※

ごにょごにょすれば万事解決!!• よし、まずは関数のプロトタイプから定義

だ!• ※作るにあたって、拡張メソッドである必要性はありません

Page 5: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

だがしかし

Page 6: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

重大な問題を発見しました!• Func<> や Action<> は………

ref / out 引数を含むメソッドを……受け止められない!!!!!!!

• … ところで、typeof(Func<>) とかtypeof(Dictionary<,>) って書くと

開いた ( 完全に具象化されていない )ジェネリック型オブジェクトが得られるんです。知りませんでした。びっくり!

Page 7: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

そんなわけで

Page 8: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

作りました

Page 9: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

• public delegate void ActionRef1<TRef>(ref TRef argRef1);• public delegate void ActionRef1<T, TRef>

(T arg1, ref TRef argRef1);( 省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 )

• public delegate void ActionRef4<TRef1, TRef2, TRef3, TRef4>(ref TRef1 argRef1, ref TRef2 argRef2, ref TRef3 argRef3, ref TRef4 argRef4);

( 省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 )

• public delegate TReturn FuncOut4<TOut1, TOut2, TOut3, TOut4, TReturn>(out TOut1 argOut1, out TOut2 argOut2, out TOut3 argOut3, out TOut4 argOut4);

( 省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 ) (省略 )

• public delegate TReturn FuncOut8<TOut1, TOut2, TOut3, TOut4, TOut5, TOut6, TOut7, TOut8, TReturn>( out TOut1 argOut1, out TOut2 argOut2, out TOut3 argOut3, out TOut4 argOut4, out TOut5 argOut5, out TOut6 argOut6, out TOut7 argOut7, out TOut8 argOut8);

Generated by ConsoleApplication31.exe (144 デリゲート型 )

Page 10: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

多値返却 ( もどき ) 構想• モデルケース :bool int.Parse(string, out int value)

• bool(string, out int) をTuple<bool, int>(string) にすればでき

る!

• Tuple は .NET FX 4.0 で正式に導入されます– 実装は簡単なのでちょいと作るなり外から持ってくる

なり

• そんな感じで、作ってみました

Page 11: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

• public delegate TReturn FuncOut1<T, TOut, TReturn> (T arg1, out TOut argOut1);

• public struct Tuple<T1, T2> { public T1 Item1; public T2 Item2; public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; }}

• public static class Extension { public static Tuple<TReturn, TOut> InvokeMulti <T, TOut, TReturn> (this FuncOut1<T, TOut, TReturn> func, T arg) { TOut value; return new Tuple<TReturn, TOut> (func(arg, out value), value); }}

Page 12: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

実行してみ

Page 13: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

Powered by LINQPad<http://www.linqpad.net/>

Page 14: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

ちょっと不恰好だけど

多値返却できた!

Page 15: わんくま東京#38 LT 「Func と ref / out 小咄」

わんくま同盟 東京勉強会 #38

ご清聴ありがとう

ございました