C#事件消息
这是一个基本的问题,但我只是从编码开始, 我试图创建一个事件的消息,但它不允许我C#事件消息,c#,events,C#,Events,这是一个基本的问题,但我只是从编码开始, 我试图创建一个事件的消息,但它不允许我 namespace Homework_Excercise { public delegate void bdateHandler(); class Program { static void Main(string[] args) { Person p = new Person(); Console.Writ
namespace Homework_Excercise
{
public delegate void bdateHandler();
class Program
{
static void Main(string[] args)
{
Person p = new Person();
Console.Write("Enter your name: ");
p.name = Console.ReadLine();
string tmp = p.name;
p.happybday += new bdateHandler(bday_msg(tmp));
Console.Write("Enter your age: ");
p.age = int.Parse(Console.ReadLine());
}
static void bday_msg(string name)
{
Console.WriteLine("Happy birthday to you!\nHappy birthday to you!\nHappy birtday dear {0}!", name);
}
}
}
二等舱:
namespace Homework_Excercise
{
class Person
{
public event bdateHandler happybday;
private int Age;
public int age
{
get { return Age; }
set { Age = value; }
}
private string Name;
public string name
{
get { return Name; }
set { Name = value; }
}
}
}
你的第一个问题是
p.happybday += new bdateHandler(bday_msg(tmp));
应该是
p.happybday += new bdateHandler(bday_msg);
因为您应该指定一个方法,而不是方法的结果。接下来你的问题是
您的自定义代理应该接受String
值(因为bday\u msg
接受),而它不接受
更好的方法是使用标准EventHandler而不是自定义委托:
class Person {
// there's a good standard class for it, do not re-invent the wheel
public event EventHandler HappyBirthday;
...
}
...
static void Main(string[] args) {
Person p = new Person();
...
// assign the method, not its result
p.HappyBirthday += bday_msg;
...
}
static void bday_msg(Object sender, EventArgs args) {
Person person = sender as Person;
// So you have Person and you can take any property you like, e.g. "name"
Console.WriteLine("Happy birthday to you!\nHappy birthday to you!\nHappy birtday dear {0}!", person.name);
}
最后,您必须引发事件:在Person
类中的某个地方应该出现类似
if (null != HappyBirthday)
HappyBirthday(this, EventArgs.Empty);
您需要在
Person
类中进行一些修改,并替换p.happybday+=newbdatehandler(x=>bday_msg(tmp))代码>与p.happybday+=bday\u msg代码>来自Main
方法
namespace Homework_Excercise
{
class Person
{
public delegate void bdateHandler(string message);
public event bdateHandler happybday;
public void RaiseEvent(string message)
{
if (happybday != null)
{
happybday(message)
}
}
private int _age;
public int age
{
get
{
return _age;
}
set
{
_age = value;
if (/*condition with age*/)
{
RaiseEvent(Name);
}
}
}
private string Name;
public string name
{
get { return Name; }
set { Name = value; }
}
}
}
让我们运行创建事件的公认方法,首先,如果希望事件具有参数,请创建一个包含这些参数的类:
public class BirthdayEventArgs : EventArgs
{
public string Message { get; private set; }
public BirthdayEventArgs(string message) { Message = message; }
}
您可以看到,这个类派生自EventArgs
,它是事件参数的公共基类。该类没有做太多的工作,只是将消息
分配给消息
属性,但是可以对其进行扩展以包含其他信息
接下来,让我们看看如何实现Person
类来处理此事件:
public class Person
{
public event EventHandler<BirthdayEventArgs> HappyBirthday;
public int Age { get; set; }
public string Name { get; set; }
public void ItsMyBirthday()
{
if (HappyBirthday != null)
HappyBirthday(this,
new BirthdayEventArgs(
string.Format("{0} birthday is today and is {1} years old!",
Name, Age)));
}
}
这与您现有的非常简单,但是您可以将其更改为接受用户的输入。事件处理程序声明为p.HappyBirthday+=HappyBirthday代码>其中右侧的HappyBirthday
与事件的代表签名匹配
在事件处理程序中,您会得到一个发送方
,它是引发事件的Person
的盒装版本,以及事件参数对象
如果要查看此运行,请查看您遇到了什么错误?什么意思它不允许你?你没有在任何地方举办活动。你应该看看如何举办活动。您将找到有关如何提出这些问题的教程。在进行此练习之前,您应该尝试在MSDN上练习该示例,以更清楚地了解事件您的委托不接受字符串参数,但您尝试向其提供的方法是bday\u msg
应该是bday\u msg(对象发送方,EventArgs args)
匹配事件处理程序的签名
@Erik:谢谢!我已经编辑了代码(包括引发事件时的EventArgs.Empty
)+1,以便在结尾使用Yoda时态。OP(和其他人)的教训:作为一种良好的防御性编码实践,始终首先比较常量,然后比较对象。否则,如果(HappyBirthday=null){…}
最终写入,然后失败。
public class Program
{
public static void Main(string[] args)
{
//Create the person
Person p = new Person() { Name = "Joe Smith", Age = 142 };
p.HappyBirthday += HappyBirthday; //Subscribe to the event
p.ItsMyBirthday(); //Raises the event
Console.WriteLine("Press any key to quit");
Console.ReadKey(true);
}
static void HappyBirthday(object sender, BirthdayEventArgs e)
{
//sender is the Person, and it has event arguments
Console.WriteLine(e.Message);
}
}