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

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

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