2009-08-31 13 views
11

ハイ技術者、C#でC#の:ブール戻り値の型

とマルチキャストデリゲートを作成、どのように我々は、DateTimeオブジェクトを受け取り、ブール値を返すマルチキャストデリゲートを定義することができます。

おかげ

答えて

33
public delegate bool Foo(DateTime timestamp); 

に関するリファレンスです。すべての代理人は潜在的にマルチキャストであり、単純に初期化が必要です。以下のような:fAllを呼び出す

public bool IsGreaterThanNow(DateTime timestamp) 
{ 
    return DateTime.Now < timestamp; 
} 

public bool IsLessThanNow(DateTime timestamp) 
{ 
    return DateTime.Now > timestamp; 
} 

Foo f1 = IsGreaterThanNow; 
Foo f2 = IsLessThanNow; 
Foo fAll = f1 + f2; 

、この場合にはIsGreaterThanNow()IsLessThanNow()の両方を呼び出します。

これは、各戻り値にアクセスできるようにするものではありません。あなたが得るのは最後に返された値だけです。それぞれの値をすべて取得するには、手動でマルチキャストを手動で処理する必要があります。

List<bool> returnValues = new List<bool>(); 
foreach(Foo f in fAll.GetInvocationList()) 
{ 
    returnValues.Add(f(timestamp)); 
} 
2
class Test 
{ 
    public delegate bool Sample(DateTime dt); 
    static void Main() 
    { 
     Sample j = A; 
     j += B; 
     j(DateTime.Now); 

    } 
    static bool A(DateTime d) 
    { 
     Console.WriteLine(d); 
     return true; 
    } 
    static bool B(DateTime d) 
    { 
     Console.WriteLine(d); 
     return true; 
    } 
} 
3

任意のデリゲートは、マルチキャストデリゲートすることができ

delegate bool myDel(DateTime s); 
myDel s = someFunc; 
s += someOtherFunc; 

msdn

デリゲートの有用な特性は は、彼らが1 デリゲートに割り当てることができるということであるオブジェクトマルチキャストするインスタンス を使用しています+演算子。代理人は を構成した2人の代理人を から構成しました。同じタイプの の代理人だけが作成できます。

EDIT: delagateが結合メソッドのリストを返すメソッドGetInvocationListを有しています。ここで

これはあなたが記述シグネチャを持つデリゲートを宣言する方法です Delegate invocation

foreach(myDel d in s.GetInvocationList()) 
{ 
    d(); 
} 
+2

コンポジットデリゲートを呼び出すときに、そのコンポジットデリゲートの戻り値はどうなりますか?呼び出された後に戻り値を検査することができる配列がありますか?以前はマルチキャスト代理人を使っていましたが、戻り値の型を持つことは考えていませんでした。 – AaronLS

0

私は同じ問題を抱えていました。私は検索し、これをmsdnで見つけました。

http://msdn.microsoft.com/en-us/library/2e08f6yc(v=VS.100).aspx

  • EndInvokeを
  • リンクはコードサンプルと、詳細にこれらを説明委任

    • BeginInvokeを上の2つの方法があります。

      デリゲートの戻り値を処理するために、これらのメソッドにフックすることができます。