对delegate的理解

 
delegate有多播和非多播(叫单一也行,我是这么叫的)之分。
delegate对于新手来说真的很不好理解,我大概断断续续的理解了10多天才算明白了点,现在说说。
声明方式: 访问修饰符 delegate 返回类型 委托名(参数);
红色部分是必须写的,蓝色部分可写可不写。
委托是什么?答:是委托(这是废话)。
委托干什么的?答:往下慢慢看(这不是废话)。
我来打个比喻吧。
delegate是关键字,这没什么好说的了,OK,比如说现在有个老板,有N个员工,有一个工作(工作 = 委托名),这个工作是老板给一些钱(钱 = 参数),去买一些东西(买东西 = 具体的行为),完事以后报告一下结果,结果就是买没买到(结果 = 返回类型)。
delegate 结果工作(钱);
看这个式子,再和上面的声明方式对照一下。
OK,现在有三件工作,1:买车票。2:买石头。3:买木材。
这个三件工作有两个特性:1:都需要钱。2:都有结果(买没买到)。
这两个特性正好符合上面声明的委托了。所以这三件事都可以由上面这个委托来办。
OK。比喻完了,来点具体的代码。
(稍等,我去写代码。。。。。。
OK,我写完了,说明我都写在代码中了。
using System;
using System.Collections.Generic;
using System.Text;
namespace ConsoleApplication1
{
delegate bool DoWork(double money);
//声明委托,返回类型bool表示是否买到东西,参数是钱。
class BuySomething
{
//买车票
bool BuyTicket(double needMoney)
{
if (needMoney < 100)
{
Console.WriteLine("Fail");
return false;
}
else
{
Console.WriteLine("Succeed");
return true;
}
}
//买石头
bool BuyStone(double needMoney)
{
if (needMoney < 200)
{
Console.WriteLine("Fail");
return false;
}
else
{
Console.WriteLine("Succeed");
return true;
}
}
//买木材
bool BuyWood(double needMoney)
{
if (needMoney < 300)
{
Console.WriteLine("Fail");
return false;
}
else
{
Console.WriteLine("Succeed");
return true;
}
}
static void Main(string[] args)
{
BuySomething buy = new BuySomething();
DoWork dowork = new DoWork(buy.BuyTicket);
//实例化委托。
//参数只写方法名,不要后面的括号。
dowork(150);
//OK,给150银子,能买哦。
//买完车票,该买石头了
dowork = new DoWork(buy.BuyStone);
dowork(250);
//Succeed
//买完石头,该买木材了
dowork = new DoWork(buy.BuyWood);
dowork(250);
//Fail。钱不够。
Console.ReadLine();
}
//只要是符合:1:返回型为bool。2:参数只有一个且为double。这两个条件的Method都可以用这个委托来执行。
}
}
多播委托是什么呢?就是好像有点批处理的意思,不多说了,不是很难,给出个代码。
注意,多播委托的返回类型必须是void。
这是一个winform程序,form中有2个textbox,4个label,1个button。想要运行这个代码,先把这几个控件拽进去。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace MulticastDelegate
{
delegate void DelCount();
public partial class Form1 : Form
{
int a, b;
double result;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
a = int.Parse(textBox1.Text.Trim());
b = int.Parse(textBox2.Text.Trim());
DelCount dc = new DelCount(Label1Method);
dc += new DelCount(Label2Method);
dc += new DelCount(Label3Method);
dc += new DelCount(Label4Method);
dc();
}
void Label1Method()
{
result = a + b;
label1.Text = a.ToString() + " + " + b.ToString() + " = " + result.ToString();
}
void Label2Method()
{
result = a - b;
label2.Text = a.ToString() + " - " + b.ToString() + " = " + result.ToString();
}
void Label3Method()
{
result = a * b;
label3.Text = a.ToString() + " * " + b.ToString() + " = " + result.ToString();
}
void Label4Method()
{
if (b == 0)
{
label4.Text = "";
}
else
{
result = a * 1.0 / b;
label4.Text = a.ToString() + " / " + b.ToString() + " = " + result.ToString();
}
}

}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值