第二十六节 深入委托实例补充

      委托,事件,匿名方法,扩展方法等,这些只有通过多多的练习才能有更深入的领悟。有些概念是想不通的,只有做了才能稍有明白,只有多做才能真正明白。我做的这个实例只是比葫芦画瓢而矣:

一个委托类(Add),一个主窗体Form1,一个子窗体Form2(实现窗体互动)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WF26
{

    public delegate void addDelegate(string s1, int i, string s3);

    public static class Add
    {
       
        public static event addDelegate addEvent;

        public static void senInfo(string s1, int i, string s3)
        {
            addEvent(s1, i, s3);
        }

    }
}

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

namespace WF26
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        /// <summary>
        /// 将用户输入添加到列表项中来
        /// </summary>
        /// <param name="s1">姓名</param>
        /// <param name="s2">年龄</param>
        /// <param name="s3">住址</param>
        public void Add_addEvent(string s1, int i, string s3)
        {

            ListViewItem lvi = new ListViewItem(s1);//Listview特有的类,代表一行
            lvi.SubItems.Add(i.ToString());
            lvi.SubItems.Add(s3);

            livInfo.Items.Add(lvi);//添加到列表项
        }

        /// <summary>
        /// 主窗体加载的同时运行委托
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Form1_Load(object sender, EventArgs e)
        {
            livInfo.Items.Clear();
            //委托好似一座桥梁,它将Add_addEvent方法作为addEvent事件的一个执行者
            //如果有返回值呢?
            Add.addEvent += new addDelegate(Add_addEvent);
        }

        /// <summary>
        /// 显示子窗体
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAdd_Click(object sender, EventArgs e)
        {

            Form2 f2 = new Form2();
            f2.Show();
        }

        /// <summary>
        /// 删除员工
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnDel_Click(object sender, EventArgs e)
        {
            if (livInfo.SelectedItems.Count > 0)
            {
                //如果被选择项数目大于0
                foreach (ListViewItem lvi in livInfo.SelectedItems)
                {
                    //遍历被选择的每一项,并删除
                    livInfo.Items.Remove(lvi);
                }
            }
        }
    }
}

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

namespace WF26
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            //无加载
        }

        private void btnOK_Click(object sender, EventArgs e)
        {
            
            try
            {
                //调用委托类中的一个被监视方法
                Add.senInfo(tbName.Text, Convert.ToInt32(tbAge.Text), tbAddr.Text);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally {
                //清空
                tbName.Text = "";
                tbAge.Text = "";
                tbAddr.Text = "";
            }
            //关闭本窗口
            this.Close();

        }
    }
}

执行的结果:



为了能记忆长久,更重要的还是理解上,我不断的在用实践体会:以下是对匿名方法和Lamada表达式及委托与方法的关系的练习:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Con26_2
{
    class Program
    {
        /// <summary>
        /// 定义一个有参数有返回值委托类
        /// </summary>
        /// <returns>返回整型值</returns>
        public delegate int delegateHandler(int a,int b);

        static void Main(string[] args)
        {
            Console.WriteLine("请输入二元运算的第一个整型数字:");
            int Number1 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("请输入二元运算的第二个整型数字:");
            int Number2 = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("请问您预想进行什么运算?+,-,*,/:");
            string str = Console.ReadLine();

            int result = 0;
            delegateHandler dh = null;
            switch (str)
            { 
                case "+":
                    dh = Add;
                    break;
                case "-":
                    dh = Sub;
                    break;
                case "*":
                    dh = Mul;
                    break;
                case "/":
                    dh = Div;
                    break;
                default:
                    Console.WriteLine("请重新输入:");
                    str = Console.ReadLine();
                    break;
            }
            result = dh(Number1, Number2); 

            //写个匿名方法
            dh = delegate(int a,int b) {
                return a % b;
            };
            int t1 = dh(10, 3);

            //Lamada表达式
            dh = (a, b) => a + b;
            int t2 = dh(23, 90);//注意在Lamada表达中,定义的委托类中是有返回值的,但Lamada中并没有return

            Console.WriteLine("您的答案是:{0}",result);

            Console.WriteLine("匿名方法所得结果是:{0}", t1);
            Console.WriteLine("Lamada所得结果是:{0}", t2);
            Console.ReadLine();
        }

        /// <summary>
        /// 加法运算
        /// </summary>
        /// <param name="a">整数a</param>
        /// <param name="b">整数b</param>
        /// <returns>整数</returns>
        public static int Add(int a, int b)
        {
            return a + b;
        }

        /// <summary>
        /// 减法运算
        /// </summary>
        /// <param name="a">整数a</param>
        /// <param name="b">整数b</param>
        /// <returns>整数</returns>
        public static int Sub(int a, int b)
        {
            return a - b;
        }

        /// <summary>
        /// 乘法运算
        /// </summary>
        /// <param name="a">整数a</param>
        /// <param name="b">整数b</param>
        /// <returns>整数</returns>
        public static int Mul(int a, int b)
        {
            return a * b;
        }

        /// <summary>
        /// 除法运算
        /// </summary>
        /// <param name="a">整数a</param>
        /// <param name="b">整数b</param>
        /// <returns>整数</returns>
        public static int Div(int a, int b)
        {
            int result = 0;
            if(b != 0){
                result = a / b;
            }
            return result;
        }
    }
}

测试结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值