委托使用示例

本文详细介绍了如何使用委托实现动态方法调用,以及如何利用委托在多窗体间实现信息传递。通过实例演示了动态选择计算方法进行数值运算,并展示了委托在构建主从窗体通信桥梁的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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();

        }
复制代码

 

更多的委托技术内幕可以参见另一篇日记。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值