public Form2() { InitializeComponent(); this.label1.Click += new System.EventHandler(this.label1_Click_1); } void ev(object sender, EventArgs e) { MessageBox.Show(sender.ToString()); } private void label1_Click_1(object sender, EventArgs e) { label1.BeginInvoke(new EventHandler(ev), new object[] { "I LOVE YOU" }); } 这个为什么 我的委托时两个参数 却可以只写一个参数的啊?
不一样的概念。委托你理解为把事件当参数就行了,所以就是这样
this.label1.Click += new System.EventHandler(this.label1_Click_1);
但是怎么调用是另外一回事
你这个说法理解不来...囧
@.F.: 我们平常写方法,参数不是值类型就是引用类型吗?但是如果我们需要把整个方法作为参数传给另外一个方法去执行,就需要用到委托。
winform/WEBform的这种叫事件委托。
后来还出了FUNC<OUT T>委托和action<T>,这2种属于匿名委托
和你解释不清楚,自己百度吧。
你是说:
new object[] { "I LOVE YOU" }
这里只有一个参数吧?
确实,委托
new EventHandler(ev)
的ev函数是俩参数的,这里怎么是一个元素的数组呢?
1、这个代码是能编译通过的,这个没问题
2、能否运行,没做过实验,理论上是不能运行的
3、假如运行通过了,那估计ev函数的参数是引用类型,是可以为空的,于是使用了默认的null。
4、如果3的猜测是正确的,你可以在ev的函数里检查参数e是否为null
public partial class Form1 : Form { public Form1() { InitializeComponent(); } void ev1(object sender, MyEventArgs e) { try { Message(MethodBase.GetCurrentMethod().Name + "," + sender.ToString()); } catch (Exception ee) { Message(MethodBase.GetCurrentMethod().Name + "," + sender.ToString() + "," + ee.Message); } } void ev2(object sender, EventArgs e) { try { Message(MethodBase.GetCurrentMethod().Name + "," + sender.ToString()); } catch (Exception ee) { Message(MethodBase.GetCurrentMethod().Name + "," + sender.ToString() + "," + ee.Message); } } private void Message(string message) { textBox1.AppendText(message); textBox1.AppendText(Environment.NewLine); } private void label1_Click(object sender, EventArgs e) { label1.BeginInvoke(new EventHandler(ev2), new object[] { "I LOVE YOU 1" }); label1.BeginInvoke(new EventHandler(ev2), new object[] { "I LOVE YOU 2", new KeyEventArgs(Keys.A) }); label1.BeginInvoke(new MyEventHandler2(ev2), new object[] { "I LOVE YOU 3" }); label1.BeginInvoke(new MyEventHandler2(ev2), new object[] { "I LOVE YOU 4", new KeyEventArgs(Keys.A) }); label1.BeginInvoke(new MyEventHandler(ev1), new object[] { "I LOVE YOU 5" }); } } public delegate void MyEventHandler(object sender, MyEventArgs e); public delegate void MyEventHandler2(object sender, EventArgs e); public class MyEventArgs : EventArgs { public static readonly MyEventArgs Empty = new MyEventArgs(); public MyEventArgs() { } }
上面是我的实验代码,有意思,eventargs这个类型是能自动构建的,别的不可以,我用MyEvent就不可以。
@519740105: 参数数量不匹配 囧...为啥呢
参数可以是null