2016-09-28 66 views
-6

函數調用錯誤。我試圖用加法和乘法的運算程序,但它不工作就搞定了,我試圖召多功能我的代碼如下C#中的事件和代表#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace delegatEvents 
{ 

    delegate int number(int i); 
    class Program 
    { 
     public static event number variable; 
     static int no = 5; 

     public static int addnumber(int p) 
     { 

      no += p; 
      return no; 
     } 
     public static int multiply(int m) 
     { 
      no *= m; 
      return no; 
     } 

     public static int getnum() 
     { 
      return no; 
     } 

     static void Main(string[] args) 
     { 
      number p; 

      variable +=new number(addnumber); 
      variable += new number(multiply); 

      variable(3); 
      Console.WriteLine(" addition number is : {0}", getnum()); 
      variable(2); 
      Console.WriteLine(" multiplication number is : {0}", getnum()); 

      Console.ReadLine(); 
     } 
    } 
} 

這是一個控制檯窗口的應用程序。

+2

爲此使用事件沒有什麼意義。您正在訂閱這兩個事件,因此首先會發生添加,然後是每次調用「variable(n)'調用時的乘法。 – CodeCaster

+2

點擊這裏 - [事件和代表簡化](http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified) –

+0

所以,你創建了組合委託'''變量'',變量(3)''' - >首先會加上no = 3 + no(5 + 3 = 8),然後再乘以no = 3 * no = 24.然後,在'''variable(2);' ''你首先添加no = 2 + no = 26,然後乘以no = 2 * no = 52.這就是爲什麼你會得到輸出24和52 – tym32167

回答

1

好的,我會試着解釋它是如何工作的。委託人就像(實際上是)指向方法的指針。

delegate int SomeDelegate(int i); 

public class Delegates 
{ 
    public SomeDelegate Delegate { get; set; } 

    public Delegates(SomeDelegate _delegate) 
    { 
     Delegate = _delegate; 
    } 

    public int InvokeDelegate(int i) 
    { 
     return Delegate(i); 
    } 
} 

在上面的類中,您可以看到第一行是委託類型聲明。我們描述我們想要看到的「方法模式」,在這種情況下 - 我們想要返回整數並接受整數的方法。

屬性「委託」被聲明爲存儲我們在構造函數中賦值的「方法指針」。

InvokeDelegate方法只是調用我們存儲在Delegate屬性中的方法。在.NET 3.5中,我們有一些「語法糖」,如Action和Func:

  • Action - 是一個沒有結果(void)的簡單泛型委託。
  • Func - 這一個完全像Action,但它有一個結果。下面有一個例子:

    public class NewDelegates 
    { 
        public Action VoidDelegate { get; set; } 
        public Action<int> VoidDelegateWithIntParameter { get; set; } 
    
        public Func<int> NonVoidDelegate { get; set; } 
        public Func<int, int> NonVoidDelegateWithParameter { get; set; } 
    
        public NewDelegates(Action _voidDelegate, 
             Action<int> _voidDelegateWithParameter, 
             Func<int> _nonVoidDelegate, 
             Func<int, int> _nonVoidDelegateWithParameter) 
        { 
         VoidDelegate = _voidDelegate; 
         VoidDelegateWithIntParameter = voidDelegateWithParameter; 
    
         NonVoidDelegate = nonVoidDelegate; 
         NonVoidDelegateWithParameter = nonVoidDelegateWithParameter; 
        } 
    
        public void InvokeVoid() 
        { 
         VoidDelegate(); 
        } 
    
        public void InvokeVoidWithParams(int arg) 
        { 
         VoidDelegateWithIntParameter(arg); 
        } 
    
        public int InvokeNonVoid() 
        { 
         return NonVoidDelegate(); 
        } 
    
        public int InvokeNonVoidDelegateWithParameter(int arg) 
        { 
         return NonVoidDelegateWithParameter(arg); 
        } 
    } 
    

現在讓我們來談談事件。如果簡單地說,事件是委託數組。當你調用事件時 - 你調用所有存儲的代理。下面有一個簡單的例子:

public class Events 
{ 
    public event Action<int> OnValueChanged; 
    public int Value { get; set; } 

    public void ChangeValue(int i) 
    { 
     Value = i; 

     if(OnValueChanged != null) 
      OnValueChanged(Value); 
    } 
} 

正如你可以看到上面 - 如果沒有「用戶」的事件可以爲空。此外,這個事件只能從拒絕它的類中提出(調用)。