8

我最近经常使用 c# 和事件,但我才刚刚开始创建自己的事件并使用它们。我对为什么使用 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);
        }
    }
4

5 回答 5

8

看一下

C# 事件与委托

event 关键字是委托声明的修饰符,允许将其包含在接口中,限制它从声明它的类中调用,为其提供一对可定制的访问器(添加和删除)并强制签名委托(在 .NET 框架中使用时)。

于 2012-10-23T03:57:06.410 回答
7

event关键字允许您指定addremove操作与声明内联。

private Action _myEvent;

public event Action MyEvent
{
    add
    {
        Console.WriteLine("Listener added!");
        _myEvent += value;
    }
    remove
    {
        Console.WriteLine("Listener removed!");
        _myEvent -= value;
    }
}
于 2012-10-23T04:00:43.353 回答
3

目的是识别什么是事件,什么只是回调。

两者看似相同,但意义不同。

Visual Studio 还放置不同的图标来指示事件。

如果我记得很清楚,那是 C# 的早期,代表们不支持这一点:

this.mydelegatefield += somethingHere;

只有事件......但也许这只是我的想象。

编辑

只是不要误导......添加/删除方法有所不同。我把它放在其他答案之后(因为我忘记了这一点)。所以,信用不是我的。

于 2012-10-23T03:56:32.710 回答
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; Public 访问器相比,可能会导致问题。此外,使用getandset是一种更好的模式

于 2012-10-23T04:08:57.233 回答
0

可以将事件与您的类的属性进行比较。

  • 属性是您的 MemberField/Object 状态的接口。
  • 同样,事件是底层委托的接口。

你仍然可以在没有事件的情况下达到最终结果。但是你失去了没有事件的封装。

不受保护的委托可能容易被滥用。

于 2012-10-23T04:16:31.363 回答