delegate句を使えばDelegateクラスを継承した型が自動的につくられ、その型がメソッドを参照する役割を果たす、ということはなんとなく分かったのですが、この際、delegate句を使わず、Delegateクラスを継承したクラスを自分で定義し、delegate句を使ったときと同じような動作をするものは作れるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
どういう使い方をしたいかわかりませんが、Delegateはsealedではないものの、特殊なクラスという扱いになっていて継承はできません。
また、C#3.5からはActionやFuncを使う事がほとんどで、delegateをそのまま使う事はまずありません。
これで実現できないでしょうか。
※ FuncとActionの違いは Funcは戻り値があり、Actionはありません(voidなメソッド)
C#
1delegate void da1(); 2delegate void da2(int arg1); 3 4delegate int df1(); 5delegate int df2(int arg1); 6 7Action a1; 8Action<int> a2; 9 10Func<int> f1; 11Func<int, int> f2; 12 13private void SomeThing() { 14 da1 p = Act; 15 a1 = Act; 16 Action local_a1 = Act; // ローカルにも宣言できる 17} 18 19private void Act() { 20 21}
lambda式を使って以下の様に使う事が出来ます。
C#
1private void WithLambda() { 2 var i = 10; 3 4 Func<int, int> twice = x => x * 2; // ラムダ式 5 Func<int, int> twiceWithExistMethod = Twice; //既存のメソッドTwiceを使う場合 6 7 var j = twice(i); // j == 20; 8 var k = twiceWithExistMethod(i); // k == 20; 9} 10 11private int Twice(int arg) { 12 return arg * 2; 13}
delegateを使わなくなったというのは、例えばIEnumerable<T>
のWhere
拡張メソッドは引数としてFunc<T,bool>
は、Tを受け取ってboolを返すFuncを要求します。
C#
1private void UseWhere() { 2 List<int> list = new List<int> { 1, 2, 3, 4, 5 }; // この場合 List<T> の Tはint 3 4 var filterd = list.Where(x => { // 複数行で書く場合 5 return x % 2 == 0; 6 }); 7 8 filterd = list.Where(x => x % 2 == 0); // 同じこと 9 10 Func<int, bool> myPredicate = x => x % 2 == 0; 11 filterd = list.Where(myPredicate); 12}
投稿2016/08/25 16:45
総合スコア2604
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/25 18:53