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

来源:互联网 发布:gopro studio for mac 编辑:程序博客网 时间:2024/05/17 04:24

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

一个委托类(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;        }    }}

测试结果:


0 0
原创粉丝点击