我正在尝试理解事件和代表,经过2天的学习,看起来我仍然迷失在基本的理解中。
我写了以下代码 - class UserControl
包含事件定义。虽然程序停留在Start()
方法中,但效果很好。
如何实施buttonClick
事件?按钮对象是否在某种不同的线程中运行 - 为了能够在单击按钮时调用方法?
由于
class UserControl
{
public delegate void methodsControlDelegate();
public event methodsControlDelegate methods;
public void Start()
{
while (true)
{
if (methods != null)
{
Thread.Sleep(1000);
this.methods();
}
}
}
}
class Program
{
static void Main()
{
UserControl uc = new UserControl();
uc.methods += eventMethod;
uc.Start();
}
public static void eventMethod()
{
Console.WriteLine("EVENT METHOD");
}
}
编辑: 我修改了Windows Forms的代码。
class Writer
{
public string Text { get; set; }
public void writeMessage(object sender, EventArgs e)
{
MessageBox.Show(Text);
}
}
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
UserControl userControl = new UserControl();
Writer writer = new Writer();
userControl.WriteMessages += writer.writeMessage;
writer.Text = "HELLO, HOW ARE YOU";
}
}
class UserControl
{
public delegate void EventHandler(object sender, EventArgs e);
public event EventHandler WriteMessages;
}
答案 0 :(得分:1)
我正在努力了解事件和代表,经过2天的学习,看起来我仍然迷失在基本的理解中。
退后一步。
class Customer
{
private string name;
public string Name { get { return this.name; } }
public Customer(string name)
{
this.name = name;
}
}
属性在逻辑上是属于事物类的属性。客户有一个名称,因此Customer
有一个属性Name
。
字段是实施细节。它是一个变量,可以存储值。
类型是字段或属性的实现细节;它限制了可以将哪种数据用作此属性的值。
值 - 说" Barbara Smith" - 是与特定客户的该属性关联的值:new Customer("Barbara Smith")
。
如果不是很清楚,那么你需要退后一步并理解这一点。如果您没有获得属性,字段和值,您将无法获得活动和代表。
事件就像一个属性。它是一类事物的逻辑特征。按钮可以告诉您已点击它们,因此Click
是Button
的事件。单击该按钮会打电话给您。
委托类型是对单击按钮时 按钮的限制。
委托实例是特定函数的委托,单击该按钮时将调用该函数。
现在清楚了吗?
如何实现buttonClick事件?
了解这需要您了解Windows的工作原理。
每个Windows程序都有一个消息队列,用于接收来自操作系统的消息。当用户单击一个按钮时,Windows会在该进程的队列中放入一条消息,指出该按钮已被单击。当进程处理该消息时,将其从队列中取出,它将调用与该按钮的单击处理程序关联的委托。
按钮对象是否在某种不同的线程中运行 - 为了能够在单击按钮时调用方法?
不。如果挂起程序的UI线程,使其无法从队列中删除消息,则永远不会调用按钮单击处理程序。
实际上,从UI线程以外的任何线程调用按钮中的代码都是非法。
每当您看到Windows应用程序挂起时,几乎可以肯定,因为一些编写得不好的代码不允许消息循环及时将消息从队列中取出。
然后你继续发布一些代码,没有任何解释也没有问题。我不知道您发布该代码的原因。尝试提出一个更清晰的问题。
那就是说,查看代码,你似乎试图从控制台应用程序进行事件处理。不要这样做。 控制台应用程序不是事件驱动的。如果要创建事件驱动的应用程序,请编写WinForms或WPF应用程序。
答案 1 :(得分:0)
delegate
是方法之上的封装。它允许您传递方法,作为参考,并在您决定时执行它。委托定义了方法的签名,任何具有相同签名的方法都可以用作该委托。
events
是一个更高级别的封装,这次是在delegate
s之上。它允许添加和删除(订阅和取消订阅)方法。当事件触发时,它将调用每个添加到它的方法(委托)。这种封装是必要的,因此一个客户可以使用这种封装。该事件无法覆盖同一事件的其他客户端。