委托使用示例
来源:互联网 发布:a卡优化的单机游戏 编辑:程序博客网 时间:2024/05/16 11:38
http://www.cnblogs.com/eagle1986/archive/2012/01/19/2326243.html
一、示例: 用户输入两个操作数,再选择运算方法(加减乘除),程序即可算出结果。这个示例的关键之处在于它使用委托在运行时动态地调用不同的方法。
1、先定义一个CalculateDelegate类型的私有字段curOpt,它将引用完成不同计算任务的方法:
//声明委托类型 public delegate double CalculateDelegate(double x,double y); //当前操作类型 private CalculateDelegate curOpt;
2、定义一个方法,可以接收一个委托:
//完成计算工作 void DoCalculate(CalculateDelegate calmethod) { double x, y; try { x = Convert.ToDouble(txtNumber1.Text); y = Convert.ToDouble(txtNumber2.Text); lblInfo.Text = String.Format("结果:{0}", calmethod(x, y)); } catch (Exception e) { lblInfo.Text = String.Format("结果:非法数据"); } }
上述方法接收一个CalculateDelegate类型的参数。通过这一参数,DoCalculate方法可以动态地调用示例程序中定义的加,减,乘,除 4个方法之一。
#region "四个完成操作的方法" double Add(double x, double y) { return x + y; } double Subtract(double x, double y) { return x - y; } double Multiply(double x, double y) { return x * y; } double Divid(double x, double y) { return x / y; } #endregion
以下是动态根据选择的运算,来决定是调用哪个方法进行计算
private void txtNumber1_TextChanged(object sender, EventArgs e) { DoCalculate(curOpt); } private void txtNumber2_TextChanged(object sender, EventArgs e) { DoCalculate(curOpt); } private void rdoAdd_CheckedChanged(object sender, EventArgs e) { curOpt = this.Add; DoCalculate(curOpt); } private void rdoSubtract_CheckedChanged(object sender, EventArgs e) { curOpt = this.Subtract ; //选择函数 DoCalculate(curOpt); //调用函数 } private void rdoMultiply_CheckedChanged(object sender, EventArgs e) { curOpt = this.Multiply ; DoCalculate(curOpt); } private void rdoDivid_CheckedChanged(object sender, EventArgs e) { curOpt = this.Divid ; DoCalculate(curOpt); }
二、使用委托实现多窗体通信。
点击从窗体按钮,主窗体会记录下对按钮的单击次数。
主从窗体间信息的传送利用了ShowInfoDelegate委托,定义如下:
//声明一个委托类型 public delegate void ShowInfoDelegate(string info);
从窗体定义了一个公有的委托类型字段,它将引用一个用于记录信息的方法:
public ShowInfoDelegate recorder;
在从窗体按键的单击事件中累加计数器,并通知“记录员(recorder)”记录
private int counter =0;//计数器 private void btnClickMe_Click(object sender, EventArgs e) { counter ++; if (recorder != null) recorder(counter.ToString()); }
真正完成记录工作的是主窗体中的Record方法:
//用标签显示信息,注意,此方法可以为Private的 private void Record(String info) { lblCount.Text = info; }
主窗体构造函数的以下代码将上述代码传给从窗体的recorder字段,构筑了一座主从窗体对象间交换信息的桥梁。
public frmMain() { InitializeComponent(); //创建从窗体对象并显示 frmOther frm = new frmOther(); frm.recorder = this.Record; //向从窗体的委托变量赋值 frm.Show(); }
更多的委托技术内幕可以参见另一篇日记。
0 0
- C# 委托使用示例
- 委托使用示例
- 委托示例
- 委托示例
- 委托示例
- C#示例学习(二)-使用委托传值
- 委托代理(degegate)的理解和使用示例
- Winform 使用委托线程修改控件属性.显示时间示例
- C#委托示例
- 委托的示例
- 委托示例代码(1)
- C#委托示例
- C#委托简单示例
- 简单的委托示例
- 简单委托示例
- 委托最简单示例
- 事件和委托示例
- 委托(Delegates)示例
- IOS自带地图中,小知识点总结
- 最长回文子串
- Java 异步处理简单实践
- nvidia显卡上OpenCL的hello world程序
- Hibernate(六)——多对多关联映射
- 委托使用示例
- 第三周项目二 建设“顺序表”算法库
- 第三周 顺序表的应用(1)
- log4j配置
- 数据挖掘十大经典算法之:决策树C4.5 分类算法
- 修改苹果自带地图中的路线颜色
- Hibernate(五)——一对多单向关联映射
- BZOJ 2086 [Poi2010]Blocks 单调栈
- 第3周 项目3 - 求集合并集