首页 新闻 会员 周边

为什么有的委托明明是两个参数的,但是 在调用的时候却可以只写一个参数?

0
[已解决问题] 解决于 2020-07-13 10:46
        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" });
          
        }



这个为什么 我的委托时两个参数  却可以只写一个参数的啊?
.F.的主页 .F. | 初学一级 | 园豆:13
提问于:2014-09-15 21:15
< >
分享
最佳答案
0

不一样的概念。委托你理解为把事件当参数就行了,所以就是这样

this.label1.Click += new System.EventHandler(this.label1_Click_1);

但是怎么调用是另外一回事

奖励园豆:5
Cherbim | 菜鸟二级 |园豆:323 | 2014-09-15 21:21

你这个说法理解不来...囧

.F. | 园豆:13 (初学一级) | 2014-09-15 21:23

@.F.: 我们平常写方法,参数不是值类型就是引用类型吗?但是如果我们需要把整个方法作为参数传给另外一个方法去执行,就需要用到委托。

winform/WEBform的这种叫事件委托。

后来还出了FUNC<OUT T>委托和action<T>,这2种属于匿名委托

和你解释不清楚,自己百度吧。

Cherbim | 园豆:323 (菜鸟二级) | 2014-09-15 21:32
其他回答(2)
0

你是说:

new object[] { "I LOVE YOU" }

这里只有一个参数吧?

确实,委托

new EventHandler(ev)

的ev函数是俩参数的,这里怎么是一个元素的数组呢?

 

1、这个代码是能编译通过的,这个没问题

2、能否运行,没做过实验,理论上是不能运行的

3、假如运行通过了,那估计ev函数的参数是引用类型,是可以为空的,于是使用了默认的null。

4、如果3的猜测是正确的,你可以在ev的函数里检查参数e是否为null

519740105 | 园豆:5810 (大侠五级) | 2014-09-15 23:27
    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就不可以。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-15 23:46

@519740105: 参数数量不匹配  囧...为啥呢

支持(0) 反对(0) .F. | 园豆:13 (初学一级) | 2014-11-07 15:57
0

参数可以是null

Firen | 园豆:5385 (大侠五级) | 2014-09-16 07:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册