“event”关键字的用途

时间:2012-10-23 03:54:17

标签: c# events delegates

嘿伙计们我最近一直在使用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);
        }
    }

5 个答案:

答案 0 :(得分:8)

看看

C# events vs. delegates

  

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

答案 1 :(得分:6)

event关键字可让您指定与声明一致的addremove操作。

private Action _myEvent;

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

答案 2 :(得分:3)

目的是确定什么是事件,什么是回调。

两者似乎都是一回事,但意义不同。

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

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

this.mydelegatefield += somethingHere;

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

修改

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

答案 3 :(得分: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是一种更好的模式

答案 4 :(得分:0)

事件可以与您班级的属性进行比较。

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

你仍然可以在没有事件的情况下实现最终结果。但是如果没有事件你就会失去封装。

非受保护的代表可能容易被滥用。