2009-08-31 61 views

回答

33
public delegate bool Foo(DateTime timestamp); 

這是如何聲明與你描述的簽名代表參考。所有代表都可能是多播,他們只需要初始化。如:

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; 

調用fAll,在這種情況下,將通話雙方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

委託的一個有用的性質對象 是,它們可以被分配給一個 代表實例要多播 使用+運營商。代表組成的 代表調用它組成的兩個代表 。只有代表 的代表可以組成同一類型。

編輯: 甲delagate有一個方法GetInvocationList返回與所連接的方法的列表。

這是一個關於Delegate invocation

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

調用它時,組合委託的返回值會發生什麼?是否有某種數組可以讓你在被調用後檢查返回值?我以前使用過多播委託,但從未想過他們有返回類型。 – AaronLS 2009-08-31 08:57:53

0

我正在磕磕絆絆地遇到同樣的問題。我搜索並發現這在MSDN。

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

上有代表

  • BeginInvoke的兩種方法
  • EndInvoke會

的鏈接描述了這些詳細地說,與代碼示例。

我們可以掛鉤到這些方法來處理代表的返回值。