delegate对于+=运算符的重载实际就是实现的combine方法吗?但是+=后面跟一个new *delegate也可以,跟一个方法名也可以,而combine要求的是一个delegate的实例啊......

崔鹏飞 2008-10-01 01:05:09
delegate对于+=运算符的重载实际就是调用的combine方法吗?但是+=后面跟一个new *delegate也可以,跟一个方法名也可以,而combine要求的是一个delegate的实例啊......

why?
...全文
453 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
崔鹏飞 2008-10-01
  • 打赏
  • 举报
回复
哦,thanks a lot
wartim 2008-10-01
  • 打赏
  • 举报
回复
至于 new ShowText(DoShowText); 产生的函数指针是指向原有函数的还是指向改函数的复制品就不知道了
wartim 2008-10-01
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication18
{
public partial class Form1 : Form
{
delegate void ShowText(String S); // 函数定义
ShowText DelegateList = null; // 定义一个函数指针空列表
public Form1()
{
InitializeComponent();

MessageBox.Show("开始第一次调用");
DelegateList += DoShowText; // 函数的入口地址直接加入委托列表,内部列表+1,内容存放函数的入口地址
DelegateList("1个函数指针,所以现在输出1次"); // 利用函数指针调用函数

MessageBox.Show("开始第二次调用");
ShowText P = new ShowText(DoShowText);
DelegateList += P; // 函数指针加入委托列表,内部列表+1,内容存放函数指针的地址,而函数指针指向函数入口地址,所以其实等于指向函数的入口地址
DelegateList("2个函数指针,所以现在输出2次"); // 利用函数指针调用函数
}
void DoShowText(String Text)
{
MessageBox.Show(Text);
}
}
}
崔鹏飞 2008-10-01
  • 打赏
  • 举报
回复
我主要想知道的是:为什么+=后面可以跟一个函数名?函数名会相应的隐式转换为一个delegate吗?
比如:P+=DoShowText;可以P+=new ShowText(DoShowText);也可以
而Combine()要求的是一个delegate,那么P+=DoShowText;这句里面函数名相应的隐式转换为一个ShowText了吗?
wartim 2008-10-01
  • 打赏
  • 举报
回复
另外更正一下
委托可以简单近似理解为C++里的函数指针数组
______
A->| d1 |
______
| d2 |
______
| d3 |
______
| B |
______

wartim 2008-10-01
  • 打赏
  • 举报
回复
当然这个例子只是例子,不建议这样用,失去了委托的意义
wartim 2008-10-01
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication18
{
public partial class Form1 : Form
{
delegate void ShowText(String S); // 定义函数指针原型
public Form1()
{
InitializeComponent();
ShowText P = DoShowText; // 定义一个函数指针指向函数,这样这个指针存的就是函数的入口地址
P("GO"); // 利用函数指针调用函数
}
void DoShowText(String Text)
{
MessageBox.Show(Text);
}
}
}
崔鹏飞 2008-10-01
  • 打赏
  • 举报
回复
不懂函数指针......
wartim 2008-10-01
  • 打赏
  • 举报
回复
Delegate.Combine 方法 (Delegate, Delegate)
http://msdn.microsoft.com/zh-cn/30cyx32c(VS.80).aspx

委托可以简单近似理解为C++里的函数指针

A+=B
等于
A->d1
d2
d3
最后加上
A->d1
d2
d3
B

返回A

无非最后添加一个方法的入口指针或新委托方法(一个指针)
崔鹏飞 2008-10-01
  • 打赏
  • 举报
回复
方法名可以隐式转换为代理?

110,577

社区成员

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

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

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