国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#委托學習

2019-11-17 03:18:29
字體:
來源:轉載
供稿:網友

C#委托學習

雖然做.NET這行也快2年了,但基礎不太好啊,今天看了下委托方面的知識,記錄下。

1.委托

總的來說,委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。所以,引入委托后,編程人員可以把方法的引用封裝在委托對象中,然后把委托對象傳遞給需要引用方法。調用委托和調用方法的方式是一模一樣的,代碼如下:

a.代碼:

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 WForms{    public partial class Form1 : Form    {        //定義委托        PRivate delegate void WriteTextBox(char ch);        //聲明委托        private WriteTextBox writeTextBox;        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            if (checkBox1.Checked == true)            {                textBox1.Clear();                textBox1.Refresh();                // 實例化委托- 方法WriteTextBox1                writeTextBox = new WriteTextBox(WriteTextBox1);                // 委托作為參數,在方法WriteText通過委托運行WriteTextBox1方法                WriteText(writeTextBox);                textBox3.Focus();                textBox3.SelectAll();            }            if (checkBox2.Checked == true)            {                textBox2.Clear();                textBox2.Refresh();                // 實例化委托 - 方法WriteTextBox2作為參數                writeTextBox = new WriteTextBox(WriteTextBox2);                // 委托作為參數,在方法WriteText通過委托運行WriteTextBox2方法                WriteText(writeTextBox);                textBox3.Focus();                textBox3.SelectAll();            }        }        /**         *我們通過WriteText方法來向文本區寫入內容,         *它所執行的只是抽象的”寫文本“操作,至于究竟向哪個文本框寫入文字,         *對于編寫WriteText方法的程序來說是不知道,委托writeTextBox就像一個接口一樣,         *屏蔽了操作對象的差別(方法到底是想向文本區1寫入文本還是像文本區2寫入文本,         *現在我方法里面不需要去關心,         *我只需要集中在實現”書寫文本”這個操作,而不必糾結操作對象的選擇)。         */        private void WriteText(WriteTextBox writetextbox)        {            string data = textBox3.Text;            for (int i = 0; i < data.Length; i++)            {                // 使用委托 - 通過委托的不同運行不同的方法                writetextbox(data[i]);                //間歇延時                DateTime now = DateTime.Now;                while (now.AddSeconds(1) > DateTime.Now) { }            }        }        //向文本區1添加字符        private void WriteTextBox1(char ch)        {            textBox1.AppendText(ch.ToString());        }        //向文本區2添加字符        private void WriteTextBox2(char ch)        {            textBox2.AppendText(ch.ToString());        }    }}
Form1.cs

b.效果圖:

2.委托鏈

其實委托鏈就是一個委托,只是包含了多個委托而已??赐晗旅娲a,應該可以很明白。

a.代碼:

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Consoleapplication1{    class Program    {        // 聲明一個委托類型,它的實例引用一個方法,該方法返回一個string類型        public delegate string DelegateTest();        public static void Main(string[] args)        {            // 用靜態方法來實例化委托            DelegateTest dtstatic = new DelegateTest(Program.method1);            // 用實例方法來實例化委托            DelegateTest dtinstance = new DelegateTest(new Program().method2);            DelegateTest dtinstance2 = new DelegateTest(new Program().method3);            // 定義一個委托鏈對象,一開始初始化為null,就是不代表任何方法(我就是我,我不代表任何人)            DelegateTest delegatechain = null;            delegatechain += dtstatic;            delegatechain += dtinstance;            delegatechain += dtinstance2;            // Environment.NewLine - 換行符            Console.WriteLine(Environment.NewLine + dtstatic() + Environment.NewLine);// 隱式調用委托            Console.WriteLine(dtstatic.Invoke() + Environment.NewLine);// 顯式調用委托            Console.WriteLine(Environment.NewLine + Test(delegatechain));//輸出字符串            Console.Read();        }        private static string method1()        {            return "這是靜態方法1";        }        private string method2()        {            throw new Exception("拋出了一個異常");        }        private string method3()        {            return "這是實例方法3";        }        // 測試調用委托的方法        private static string Test(DelegateTest chain)        {            if (chain == null)            {                return null;            }            // 用這個變量來保存輸出的字符串            StringBuilder returnstring = new StringBuilder();            // GetInvocationList方法返回一個由Delegate引用構成的數組,            //其中每一個數組都指向鏈中的一個委托對象。            Delegate[] delegatearray = chain.GetInvocationList();            // 遍歷數組中的每個委托            foreach (DelegateTest t in delegatearray)            {                try                {                    //調用委托獲得返回值                    returnstring.Append(t() + Environment.NewLine);                }                catch (Exception e)//異常                {                    returnstring.AppendFormat("異常從 {0} 方法中拋出, 異常信息為:{1}{2}", t.Method.Name, e.Message, Environment.NewLine);                }            }            // 把結果返回給調用者            return returnstring.ToString();        }    }}
Program.cs

b.效果圖:


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平阴县| 乌审旗| 酒泉市| 绵阳市| 昂仁县| 西平县| 铅山县| 浦东新区| 婺源县| 台东市| 资中县| 石景山区| 太保市| 海兴县| 绥棱县| 凌云县| 忻城县| 扎囊县| 东丰县| 西乌| 金寨县| 濉溪县| 陵水| 廉江市| 高邮市| 金昌市| 含山县| 桦南县| 东方市| 屏东市| 隆德县| 长白| 和政县| 金平| 长武县| 岗巴县| 滦平县| 汉沽区| 厦门市| 吴堡县| 南溪县|