求助 委托和事件的问题

zglzniu 2010-02-01 11:28:21
看了张子阳的文章,有一点不太明白,这句代码是什么意思( Heater heater = (Heater)sender; )
请高人指点:http://www.tracefact.net/CSharp-Programming/Delegates-and-Events-in-CSharp.aspx
...全文
135 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zglzniu 2010-12-27
  • 打赏
  • 举报
回复
谢谢大家
hhc123 2010-02-01
  • 打赏
  • 举报
回复

public void MakeAlert(Object sender, Heater.BoiledEventArgs e)

看到没啊sender是object.
mykstar 2010-02-01
  • 打赏
  • 举报
回复
装箱时把对象或者值变成object
Heater heater = (Heater)sender是拆箱的过程,sender是触发这个事件的源,
但是只是object类型无法使用,拆箱变成Heater类来用
flyerwing 2010-02-01
  • 打赏
  • 举报
回复
Heater heater = (Heater)sender;
好象是事件源对象转换成原来的样子吧
wzp144650 2010-02-01
  • 打赏
  • 举报
回复
获得触发该事件的对象
JOCLI 2010-02-01
  • 打赏
  • 举报
回复
就是转成你触发事件的对象
sender 可以理解为发送者,事件的发送者,那事件的发送者前加上他原来的的类别,就还原出他的真实面目了
比如你有一个 Button按钮 你在Button_Click下面写 Button btn=(Button)sender;你就能得到这个按钮了
cuike519 2010-02-01
  • 打赏
  • 举报
回复
一般情况下Sender都是发出事件的对象,所以这种装换是可以的,但是不合理。

应该是用as转换,这样至少不会抛出异常,在接下来的代码里面检查header是否为null继续后面的代码。
jianshao810 2010-02-01
  • 打赏
  • 举报
回复
我觉得是多态。。但也是装箱。。
装箱与拆箱 是 一种向上 与 拆箱。而不一定是 值 与 引用。
委托嘛。。就是传递 一个方法。
比如 一个查找 List<int>的方法。
我们 可以写成public List<int> result Where(del method,List<int> source){
//由于我们只要根据一个true或者false就添加到返回的结果列表
//有时 我们要求 返回双数,有时返回单数,有时 返回>100的数
// 这时候委托就起作用啦。。
if(method(source))
{
result.Add(ele);
}
}
这样你就不用为返回双就写一个方法,单又写一个办法。
到.net 3.5 你还可以更进一步的写成 (p=>)的形式。。
whb147 2010-02-01
  • 打赏
  • 举报
回复
路过学习
tianrui456 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 paopaozhu8899 的回复:]
引用 10 楼 tianrui456 的回复:
引用 3 楼 mykstar 的回复:
装箱时把对象或者值变成object
Heater heater = (Heater)sender是拆箱的过程,sender是触发这个事件的源,
但是只是object类型无法使用,拆箱变成Heater类来用

  这个解释完全错误.... 装箱和拆箱是说的值类型和引用类型的一种转换......
  上面这个其实就是一个多态的应用


这个不是多态吧。。还是装箱和拆箱。。
[/Quote]

装箱转换是指将一个值类型隐式地转换成一个object类型,或者把这个值类型转换成一个被该值类型应用的接口类型,把一个值类型的值装箱,也就是创建一个object实例并将这个值复制给这个object. 资料连接http://blog.csdn.net/wolfpkfox/archive/2009/08/12/4437382.aspx
为了确认我在<<C#高级编程>>专门查找了一下,里面有这么一段话:装箱和拆箱可以把值类型转换为引用类型,或把引用类型转换为值类型.
而对于 MyClass cls1 = (MyClass)object1; 这种写法就是一种多态的写法,所有类都间接继承object类 也就是 开始的时候委托调用的时候用基类指针指向了泛生类地址,到最后又反转化过来
paopaozhu8899 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tianrui456 的回复:]
引用 3 楼 mykstar 的回复:
装箱时把对象或者值变成object
Heater heater = (Heater)sender是拆箱的过程,sender是触发这个事件的源,
但是只是object类型无法使用,拆箱变成Heater类来用

  这个解释完全错误.... 装箱和拆箱是说的值类型和引用类型的一种转换......
  上面这个其实就是一个多态的应用
[/Quote]

这个不是多态吧。。还是装箱和拆箱。。
tianrui456 2010-02-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 mykstar 的回复:]
装箱时把对象或者值变成object
Heater heater = (Heater)sender是拆箱的过程,sender是触发这个事件的源,
但是只是object类型无法使用,拆箱变成Heater类来用
[/Quote]
这个解释完全错误.... 装箱和拆箱是说的值类型和引用类型的一种转换......
上面这个其实就是一个多态的应用
缭绕飘渺 2010-02-01
  • 打赏
  • 举报
回复
纯属来学习的
wxm3630478 2010-02-01
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
if(OnClickUpFile != null) //改这里
{
OnClickUpFile(this,e); //事件的发起者便是 DuxUpFileCtl
//OnClickUpFile(button1,e); //如果这么写 就是button1
//我觉得这里写什么没关系,但是你自己要记得
}
}

wxm3630478 2010-02-01
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
Button bt = (Button)sender; //sender 事件的发起者
if(bt.Equals(button1))
{//是同一个对象}
}

//例如下面是一个用户控件,有一个按钮button1
public partial class DuxUpFileCtl : UserControl
{
public event EventHandler<EventArgs> OnClickUpFile;
public DuxUpFileCtl()
{
button1.Click += new EventHandler(button1_Click);
}

private void button1_Click(object sender, EventArgs e)
{
if(OnClickUpFile)
{
OnClickUpFile(this,e); //事件的发起者便是 DuxUpFileCtl
//OnClickUpFile(button1,e); //如果这么写 就是button1
//我觉得这里写什么没关系,但是你自己要记得
}
}
}

//调用事件

void DuxUpFileCtl1_OnClickUpFile(object sender,EventArgs e)
{
//OnClickUpFile(this,e); 是这个
DuxUpFileCtl uf = (DuxUpFileCtl)sender;

//OnClickUpFile(button1,e);
Button bt = (Button)sender;
}
xray2005 2010-02-01
  • 打赏
  • 举报
回复
将sender转化成触发事件的对象
wuyq11 2010-02-01
  • 打赏
  • 举报
回复
将sender转化成触发事件的对象

110,530

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧