Func<>   と  ref  /  out   小咄   ※例によって強引な取り組みです※ takeshik
自己紹介 <ul><li>自称変態  C#  プログラマ </li></ul><ul><li>MetaTweet  は  LINQ  まみれどころではない </li></ul><ul><li>真面目に書いてるつもりなんですけどねえ… </li>...
私には嫌いなものがある! <ul><li>ローカル変数が大嫌いです </li></ul><ul><ul><li>できれば、できるだけ使いたくない! </li></ul></ul><ul><ul><li>var  かどうかとかそういう次元じゃない...
私には最近興味を持つものがある! <ul><li>多値返却ってクールだよねー… ( はぁと </li></ul><ul><ul><li>多値返却があれば  ref   とか  out   とか いらないんじゃね!?いらないって!! </li><...
だが しかし
重大な問題を発見しました! <ul><li>Func<>  や  Action<>  は……… ref / out  引数を含むメソッドを…… 受け止められない!!!!!!! </li></ul><ul><li>… ところで、 typeof(F...
そんなわけで
作り ました
<ul><li>public delegate void ActionRef1<TRef>(ref TRef argRef1); </li></ul><ul><li>public delegate void ActionRef1<T, TRef...
多値返却  ( もどき )  構想 <ul><li>モデルケース : bool int.Parse(string, out int value) </li></ul><ul><li>bool(string, out int)  を Tuple<...
<ul><li>public delegate TReturn FuncOut1<T, TOut, TReturn>   (T arg1, out TOut argOut1); </li></ul><ul><li>public struct T...
実行 してみる
Powered by LINQPad < http://www.linqpad.net/ >
ちょっと不恰好だけど 多値返却できた!
ご清聴 ありがとう ございました
Upcoming SlideShare
Loading in …5
×

わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」

2,472 views

Published on

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

Published in: Technology, News & Politics
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,472
On SlideShare
0
From Embeds
0
Number of Embeds
39
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」

  1. 1. Func<> と ref / out 小咄 ※例によって強引な取り組みです※ takeshik
  2. 2. 自己紹介 <ul><li>自称変態 C# プログラマ </li></ul><ul><li>MetaTweet は LINQ まみれどころではない </li></ul><ul><li>真面目に書いてるつもりなんですけどねえ… </li></ul><ul><li>それ C# じゃないとか散々な言われようです </li></ul><ul><li>最近式という概念の美しさに取り憑かれてます </li></ul><ul><li>LINQ はメソッド形式で 使ってこそでしょ!! </li></ul>
  3. 3. 私には嫌いなものがある! <ul><li>ローカル変数が大嫌いです </li></ul><ul><ul><li>できれば、できるだけ使いたくない! </li></ul></ul><ul><ul><li>var かどうかとかそういう次元じゃない! </li></ul></ul><ul><li>その中で最も憎たらしいのは </li></ul><ul><ul><li>初期化を欠いた宣言を見ると憤りを感じる </li></ul></ul><ul><ul><li>仕方なく書いてるんだからね!!!!!!!!! int value; // ← これ!! int.Parse(&quot;1234&quot;, out value );               // ↑ こいつのせいで!!! </li></ul></ul>
  4. 4. 私には最近興味を持つものがある! <ul><li>多値返却ってクールだよねー… ( はぁと </li></ul><ul><ul><li>多値返却があれば ref とか out とか いらないんじゃね!?いらないって!! </li></ul></ul><ul><li>忌々しいローカル変数宣言を滅ぼせる!! </li></ul><ul><li>よし!自分で多値返却もどきを作るぞ!! </li></ul><ul><ul><li>関数オブジェクトに拡張メソッドぶち込んで ※ ごにょごにょすれば万事解決!! </li></ul></ul><ul><li>よし、まずは関数のプロトタイプから定義だ! </li></ul><ul><li>※ 作るにあたって、拡張メソッドである必要性はありません </li></ul>
  5. 5. だが しかし
  6. 6. 重大な問題を発見しました! <ul><li>Func<> や Action<> は……… ref / out 引数を含むメソッドを…… 受け止められない!!!!!!! </li></ul><ul><li>… ところで、 typeof(Func<>) とか typeof(Dictionary<,>) って書くと 開いた ( 完全に具象化されていない ) ジェネリック型オブジェクトが得られるんです。 知りませんでした。びっくり! </li></ul>
  7. 7. そんなわけで
  8. 8. 作り ました
  9. 9. <ul><li>public delegate void ActionRef1<TRef>(ref TRef argRef1); </li></ul><ul><li>public delegate void ActionRef1<T, TRef> (T arg1, ref TRef argRef1); </li></ul><ul><li>( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) </li></ul><ul><li>public delegate void ActionRef4<TRef1, TRef2, TRef3, TRef4>(ref TRef1 argRef1, ref TRef2 argRef2, ref TRef3 argRef3, ref TRef4 argRef4); </li></ul><ul><li>( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) </li></ul><ul><li>public delegate TReturn FuncOut4<TOut1, TOut2, TOut3, TOut4, TReturn>(out TOut1 argOut1, out TOut2 argOut2, out TOut3 argOut3, out TOut4 argOut4); </li></ul><ul><li>( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) ( 省略 ) </li></ul><ul><li>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); </li></ul><ul><li>Generated by ConsoleApplication31.exe   (144 デリゲート型 ) </li></ul>
  10. 10. 多値返却 ( もどき ) 構想 <ul><li>モデルケース : bool int.Parse(string, out int value) </li></ul><ul><li>bool(string, out int) を Tuple<bool, int>(string) にすればできる! </li></ul><ul><li>Tuple は .NET FX 4.0 で正式に導入されます </li></ul><ul><ul><li>実装は簡単なのでちょいと作るなり外から持ってくるなり </li></ul></ul><ul><li>そんな感じで、作ってみました </li></ul>
  11. 11. <ul><li>public delegate TReturn FuncOut1<T, TOut, TReturn> (T arg1, out TOut argOut1); </li></ul><ul><li>public struct Tuple<T1, T2> { public T1 Item1; public T2 Item2 ; public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; } } </li></ul><ul><li>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); } } </li></ul>
  12. 12. 実行 してみる
  13. 13. Powered by LINQPad < http://www.linqpad.net/ >
  14. 14. ちょっと不恰好だけど 多値返却できた!
  15. 15. ご清聴 ありがとう ございました

×