已有57人关注
C#开发委托
发表在C#图书答疑 2010-12-16
是否精华
版块置顶:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 委托列表
{
public partial class Form1 : Form
{
public delegate void MyDelegate(string text);
MyDelegate mainDelegate;
private void method1(string text)
{
textBox1.AppendText("方法一被调用(" + text + ")\r\n");
}
private void method2(string text)
{
textBox1.AppendText("方法二被调用(" + text + ")\r\n");
}
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (mainDelegate == null)
{
mainDelegate = this.method1;
}
else
{
mainDelegate = mainDelegate + new MyDelegate(method1);
}
}
private void button2_Click(object sender, EventArgs e)
{
if (mainDelegate == null)
{
mainDelegate = this.method2;
}
else
{
mainDelegate+=method2;
}
}
private void button3_Click(object sender, EventArgs e)
{
if (mainDelegate == null)
return;
mainDelegate -= method1;
}
private void button4_Click(object sender, EventArgs e)
{
if (mainDelegate == null)
return;
else 
mainDelegate -= method2;
}
private void button5_Click(object sender, EventArgs e)
{
textBox1.Clear();
textBox1.AppendText("调用列表\r\n");
foreach (MyDelegate del in mainDelegate.GetInvocationList())
{
textBox1.AppendText(del.Method.Name + "\r\n");
}
textBox1.AppendText("================================================\r\n");
mainDelegate("传递给委托的参数");
}
}
}
小科老师,不是点button3,是点button5。我刚开始点击button1,然后点击button5,结果列表有个方法,然后我再点击button1,再点击button5,列表有出现一个方法。接着我点击button3,然后点击button5,列表被删除了一个方法,列表还剩一个没删除,我这个时候再点击button3,然后点击button5,就报错了,错误就是:具体错误为:未将对象引用设置到对象的实例。请问这是什么问题呢?

希望我说的清楚了,请指点,小科老师!
报错误的语句是 foreach (MyDelegate del in mainDelegate.GetInvocationList())

小科老师,我判断过mainDelegate是否非空了,还是出现同样的错误。我插入断点调试,GetInvocationList显示说上下文不存在,可是为什么列表有两个方法的时候删除就不报错呢?

期待解答,明日读者!
分享到:
精彩评论 1
东方_mrkj
学分:0 LV1
2010-12-16
沙发
读者你好:
    在你的论述中有这样的说明——“列表还剩一个没删除,我这个时候再点击button3”,那么当“我这个时候再点击button3”时,mainDelegate委托链上就在没有委托对象了,也就是说mainDelegate的值为空了,所以在“foreach (MyDelegate del in mainDelegate.GetInvocationList())”语句中,再通过mainDelegate调用GetInvocationList()方法时,就会显示“未将对象引用设置到对象的实例”这样的错误,因为空的对象不能够调用方法。
首页上一页 1 下一页尾页 1 条记录 1/1页
手机同步功能介绍
友情提示:以下图书配套资源能够实现手机同步功能
明日微信公众号
明日之星 明日之星编程特训营
客服热线(每日9:00-17:00)
400 675 1066
mingrisoft@mingrisoft.com
吉林省明日科技有限公司Copyright ©2007-2022,mingrisoft.com, All Rights Reserved长春市北湖科技开发区盛北大街3333号长春北湖科技园项目一期A10号楼四、五层
吉ICP备10002740号-2吉公网安备22010202000132经营性网站备案信息 营业执照