質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1954閲覧

c#のdelegateについて

drer

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/08/25 15:46

delegate句を使えばDelegateクラスを継承した型が自動的につくられ、その型がメソッドを参照する役割を果たす、ということはなんとなく分かったのですが、この際、delegate句を使わず、Delegateクラスを継承したクラスを自分で定義し、delegate句を使ったときと同じような動作をするものは作れるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

flied_onion

総合スコア2604

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

drer

2016/08/25 18:53

ありがとうございます。継承できないんですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問