2012-10-23 57 views
7

嘿,我最近一直在使用c#和事件,但我剛剛開始創建自己的事件並使用它們。我有點困惑,爲什麼要使用event關鍵字,我只通過使用委託獲得了相同的結果。「event」的用途關鍵字

public partial class Form1 : Form 
{ 
    ServerConnection connection = new ServerConnection(); 

    public Form1() 
    { 
     InitializeComponent(); 
     connection.ref = new del(MethOne); 
     connection.ref += new del(MethTwo); 
    } 

    public void MethOne(object message) 
    { 
     MessageBox.Show((string)message); 
    } 

    public void MethTwo(object message) 
    { 
     MessageBox.Show((string)message); 
    } 

} 


public delegate void del(string message); 



public class ServerConnection 
{ 
    private TcpListener tcpListener; 
    public del ref; 

    private List<NetworkStream> clientList = new List<NetworkStream>(); 

    public ServerConnection() 
    { 
     this.tcpListener = new TcpListener(IPAddress.Any, 3000); 
     ThreadStart startListening = new ThreadStart(ListenForClients); 
     Thread startThread = new Thread(startListening); 
     startThread.Start(); 
    } 


    public void ListenForClients() 
    { 
     tcpListener.Start(); 
     ParameterizedThreadStart handleClient = new ParameterizedThreadStart(HandleClient); 

     while (true) 
     { 
      TcpClient newClient = tcpListener.AcceptTcpClient(); 
      Thread handleClientThread = new Thread(handleClient); 
      handleClientThread.Start(newClient); 
     } 
    } 


    public void HandleClient(object newClient) 
    { 
     NetworkStream clientStream = ((TcpClient)newClient).GetStream(); 
     clientList.Add(clientStream); 

     BinaryFormatter formatter = new BinaryFormatter(); 
     string message; 

     while (true) 
     { 
      message = (string)formatter.Deserialize(clientStream); 
      ref((string)message); 
     } 
    } 
+3

哦,我的......這似乎是一個合理的問題。爲什麼downvote?爲什麼關閉它? –

回答

5

event關鍵字可以內嵌指定addremove行動與聲明。

private Action _myEvent; 

public event Action MyEvent 
{ 
    add 
    { 
     Console.WriteLine("Listener added!"); 
     _myEvent += value; 
    } 
    remove 
    { 
     Console.WriteLine("Listener removed!"); 
     _myEvent -= value; 
    } 
} 
3

目的是識別什麼是事件,什麼是回調。

兩者似乎是同一回事,但含義不同。

此外Visual Studio放置不同的圖標來表示事件。

如果我記得很清楚,它的C#的早期,代表不支持這一點:

this.mydelegatefield += somethingHere; 

只有事件......但可能這只是我的想象。

編輯

只是沒有被missleading ...有添加/刪除方法的差異。我把這個放在其他答案之後(因爲我忘了這個)。所以,信用不是我的。

8

看一看

C# events vs. delegates

事件關鍵字是聲明類中的委託聲明,允許 它被包含在一個接口,約束它調用修飾符從 它爲它提供了一對 可定製訪問器(添加和刪除)並強制代理的簽名(在.NET框架中使用時)。

+0

哦,是的!添加/刪除方法。忘了那個! –

0

事件只是一件糖衣。定義事件時發生3件事。

簡單EG:

public event EventHandler alarm; 

樣品編譯器輸出

private EventHandler alarm 

public void add_alarm(EventHandler value) 
{ 
} 

public void remove_alarm(EventHandler value) 
{ 
} 

通知private相反,你public del me; 公共存取可能會引起問題。此外,使用getset是更好的模式

0

事件可以與您的類的屬性進行比較。

  • 屬性是您的MemberField/Object狀態的接口。
  • 同樣的事件是基礎委託的接口。

您仍然可以在沒有事件的情況下實現endresult,但是沒有事件就會丟失封裝。

非保護委託可能容易被濫用。

相關問題