2017-11-26 20 views
0

デリゲートのインスタンスを作成する点について何か不思議です。私はそれらが関数ポインタであることを理解していますが、デリゲートインスタンスを使用する目的は何ですか?最初に考えたのでデリゲートインスタンスと関数の直接渡しの比較

public delegate bool IsEven(int x); 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] nums = new int[] { 1, 3, 4, 5, 6,7, 8, 9 }; 

     // creating an instance of delegate and making it point to 'CheckEven' function  
     IsEven isEven = new IsEven(CheckEven); 

     // using delegate for parameter to get sum of evens 
     int tot1 = Sums(nums, isEven); 

     // passing in the function directly as parameter and not delegate instance 
     int tot2 = Sums(nums, CheckEven); 

     // using lambda expressions 
     int tot3 = Sums(nums, x=> x%2==0); 

     ReadKey(); 
    } 

    public static int Sums(int[] nums, IsEven isEvenOdd) 
    { 
     int sum = 0; 

     foreach(int x in nums) 
     { 
      if (isEvenOdd(x)) 
       sum += x; 
     } 

     return sum; 
    } 

    public static bool CheckEven(int x) 
    { 
     if (x % 2 == 0) 
      return true; 
     else 
      return false; 
    } 
} 

常にラムダを使用することを選ぶあなたが合格しようとしている機能の機能は複雑な実装を持っていない場合はそうでない理由を私はちょうど直接に私の機能を渡さないだろう、最高のアイデアのように思えますパラメーター?また、Lambdasでは、代理人と同じように新しいメソッド全体を作成することに反対して、オッズの合計を計算するようにLambdaを変更する方がずっと簡単です。

+0

_ "このメソッドをパラメータとして直接使用しているものを止めているもの" _上記のコードをコンパイルしましたか?それは持っているべきであり、そうすることで明らかにその質問に「何もない」と答えるべきでした。それは働いたので、何もあなたを止めませんでした。率直に言って、何を求めているのかははっきりしていません。 –

+2

あなたの質問は主に意見ベースですが、 'new'演算子を使うか単にメソッド名を与えるかのどちらかを知っていれば、同じことが起こります(新しいデリゲートインスタンスが作成されます)。後者は暗黙のうちに、コンパイラが '新しいIsEven(CheckEven)'をあなたのために埋め込むことで、暗黙的にそれを行います。もしあなたがそれを理解していなければ、ここでの質問が広すぎるかもしれないので、利用可能なドキュメントを読むことに努力すべきです(プログラミング言語の仕組みに関する手持ちのチュートリアルの場所ではありません)。 –

+2

私はデリゲートインスタンスを使用するポイントが何であるか尋ねてみたはずです。 – Cosmik11

答えて

0

デリゲートを直接渡した場合でも、デリゲートの定義によって期待値が設定されていない場合、Sumsメソッドはメソッド名を受け取れませんでした。

はあなたCheckEvenメソッドまたはこのメソッドのいずれかを送信することができますpublic delegate bool EvenOddStatus(int x);

にデリゲート名の変更を検討:

public static bool CheckOdd(int x) 
    { 
     if (x % 2 != 0) // here changed 
      return true; 
     else return false; 
    } 

(もちろん、あなたがではなく、より複雑なシナリオでは、ここでラムダを使用することができます)

Sumsメソッドでは、呼び出しコード(CheckEvenまたはCheckOddのいずれか)に基づいて奇数または偶数のいずれかを合計できます。

代理人はメソッドへのポインタです。コードでメソッドが受信して返す方法を定義します。呼び出しコードは、あらかじめ定義された実装をメソッドまたはデリゲートのいずれかに後で渡すことができます。

あなたのMainが何を合計、オッズまたはエベンスを知らない別の方法の場合はどうなりますか?スタックの上に呼び出しコードからのデリゲートがあります。

関連する問題