嘿伙计们我最近一直在使用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);
}
}
答案 0 :(得分:8)
看看
event关键字是允许的委托声明的修饰符 它被包含在一个接口中,约束它的调用 在声明它的类中,为它提供一对 可自定义的访问器(添加和删除)并强制签名 委托(在.NET框架中使用时)。
答案 1 :(得分:6)
event
关键字可让您指定与声明一致的add
和remove
操作。
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;
公共访问者可能会导致问题。此外,使用get
和set
是一种更好的模式
答案 4 :(得分:0)
事件可以与您班级的属性进行比较。
你仍然可以在没有事件的情况下实现最终结果。但是如果没有事件你就会失去封装。
非受保护的代表可能容易被滥用。