C#委托,事件,匿名委托


作為一個初學者,寫下來是當做自己的學習筆記,希望在以后遇到問題的時候能夠快速的找到方法

如果能幫助跟我一樣的新人是更好不過的了        如果有什么不正確或者可以改進的地方也希望大家能夠指出來  謝謝大家

1.委托

來百度一下什么是委托:委托是一個類,它定義了方法的類型,使得可以將方法當作另一個方法的參數來進行傳遞,這種將方法動態地賦給參數的做法,可以避免在程序中大量使用If-Else(Switch)語句,同時使得程序具有更好的可擴展性。(百度百科)

 

先來寫個簡單的委托:

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

namespace ConsoleApplication2
{
    class Program
    {
        //聲明沒有參數,沒有返回值的委托
        public delegate void MyDelegate();
        //委托對象
        static MyDelegate myDelegate;

        public static void Show()
        {
            Console.WriteLine("我的代理");
        }

        static void Main(string[] args)
        {
            myDelegate = new MyDelegate(Show);//實例化委托  委托myDelegate去做Show的事情
            myDelegate();//調用myDelegate
            Console.ReadKey();
        }
    }
}

 

將上面的改為帶參數,帶返回值的委托

class Program
    {
        //聲明帶參數,帶返回值的委托
        public delegate string MyDelegate(string data);
        //委托對象
        static MyDelegate myDelegate;

        public static string Show(string data)
        {
            return data;
        }

        static void Main(string[] args)
        {
            myDelegate = new MyDelegate(Show);//實例化委托  委托myDelegate去做Show的事情
            Console.WriteLine(myDelegate("委托的參數"));//在調用時,需要帶上參數
            Console.ReadKey();
        }
    }

 

現在我們寫兩個方法

 class Program
    {
        //聲明帶參數,帶返回值的委托
        public delegate void MyDelegate();
        //委托對象
        static MyDelegate myDelegate;

        public static void ShowOne()
        {
            Console.WriteLine("委托一號");
        }

        public static void ShowTwo()
        {
            Console.WriteLine("委托二號");
        }
    }

 

我們現在想輸出兩個中的一個  可以改成這樣  順便復習一下帶參數的委托

class Program
    {
        //聲明帶參數的委托
        public delegate void MyDelegate(string data);
        //委托對象
        static MyDelegate myDelegate;

        public static void Show(string data)
        {
            switch (data)
            {
                case "委托一號":
                    Console.WriteLine("委托一號");
                    break;
                case "委托二號":
                    Console.WriteLine("委托二號");
                    break;
            }
        }

        static void Main(string[] args)
        {
            myDelegate = new MyDelegate(Show);
            myDelegate("委托一號");//調用時的參數是什么就會輸出對應的委托了
            Console.ReadKey();
        }
    }

 什么委托一號  什么委托二號 這個好記 要是選項多了  東西又不太好記怎么辦  稍微改進一下

/// <summary>
    /// 1是委托一號  2是委托二號
    /// </summary> 
   enum DATA
    {
        zero,
        NumOne,
        NumTwo,
    };

    class Program
    {
        //聲明帶參數的委托
        public delegate void MyDelegate(DATA data);
        //委托對象
        static MyDelegate myDelegate;

        public static void Show(DATA data)
        {
            switch (data)
            {
                case DATA.NumOne:
                    Console.WriteLine("委托一號");
                    break;
                case DATA.NumTwo:
                    Console.WriteLine("委托二號");
                    break;
            }
        }

        static void Main(string[] args)
        {
            myDelegate = new MyDelegate(Show);
            myDelegate(DATA.NumTwo);
            Console.ReadKey();
        }
    }

 

是不是瞬間感覺高大上了     還有要活用/// <summary>    /// </summary>      這可是好東西 可以讓別人用你代碼的時候更加的清楚用的是什么有什么用處     可以提高代碼的可讀性哦

 

2.事件

如果我們希望兩個方法同時輸出該怎么做呢    應該這樣:

 class Program
    {
        //聲明帶參數,帶返回值的委托
        public delegate void MyDelegate();
        //委托對象
        static event MyDelegate myDelegate;//此處與上面不同哦

        public static void ShowOne()
        {
            Console.WriteLine("委托一號");
        }

        public static void ShowTwo()
        {
            Console.WriteLine("委托二號");
        }

        static void Main(string[] args)
        {
            myDelegate = new MyDelegate(ShowOne);//先給你對象賦上一個方法
            myDelegate += new MyDelegate(ShowTwo);//再給你加上一個方法
            myDelegate();//調用
            Console.ReadKey();
        }
    }

看下輸出  調用一個  兩個同時都顯示出來了  沒錯這就是事件(event)

 

事件可以加 那能不能減呢   聰明  你沒有猜錯 當然可以  改完后看下結果

 static void Main(string[] args)
        {
            myDelegate = new MyDelegate(ShowOne);//先給你對象賦上一個方法
            myDelegate += new MyDelegate(ShowTwo);//再給你加上一個方法
            myDelegate();//調用
            Console.WriteLine("__________________________我來分割________________________");
            myDelegate -= new MyDelegate(ShowOne);
            myDelegate();//減完后再調一次
            Console.ReadKey();
        }

 

 

3.匿名方法

委托和事件說完了  來看看特別一點的    匿名方法

在之前  每次實例化委托的時候都要有一個已經寫好的方法  而匿名方法則不需要

    class Program
    {
        //聲明帶參數的委托
        public delegate void MyDelegate(string data);
        //委托對象
        static MyDelegate myDelegate;

        static void Main(string[] args)
        {
            myDelegate = delegate(string data)         //帶參數
            {
                Console.WriteLine(data);
            };
            myDelegate("帶參數的匿名方法");
            Console.ReadKey();
        }
    }

 不帶參數的只要將參數去掉即可       delegate后面跟上你需要用的參數在{}中進行你需要的操作  最后不要忘記帶上分號哦

 

4.Lambda表達式

要是匿名方法還不夠快  那試試這個

class Program
    {
        //聲明帶參數的委托
        public delegate void MyDelegate(string data);
        //委托對象
        static MyDelegate myDelegate;

        static void Main(string[] args)
        {
            myDelegate = (string data) => { Console.WriteLine(data); };
            myDelegate("帶參數Lambda表達式");
            Console.ReadKey();
        }
    }

 代碼量是不是更少了呢  直接用小括號寫上參數,然后是=> 再用個{}來框住你的操作  同樣最后也有分號

 

5.Action

先來看看它的解釋

參數可以有好多也可以沒有  但是  他沒有返回值  來看看怎么用吧

class Program
    {
        //不帶參數的Action
        static Action actionOne;
        //帶參數的Action
        static Action<string> actionTwo;

        static void Main(string[] args)
        {
            actionOne = new Action(ShowOne);
            actionOne();

            actionTwo = new Action<string>(ShowTwo);
            actionTwo("Action ShowTwo");
            Console.ReadKey();
        }

        static void ShowOne()
        {
            Console.WriteLine("Action ShowOne\n");
        }

        static void ShowTwo(string data)
        {
            Console.WriteLine(data);
        }
    }

 試着輸出一下吧

 

6.Func

它與Action類似  但是他是必須帶返回值的

前面的都是它的參數, 最后一個參數就是他的返回值

 //不帶參數的Action
        static Func<string> FuncOne;
        //帶參數的Action
        static Func<string,string> FuncTwo;

        static void Main(string[] args)
        {
            FuncOne = new Func<string>(ShowOne);
            Console.WriteLine(FuncOne());

            FuncTwo = new Func<string, string>(ShowTwo);
            Console.WriteLine(FuncTwo("Func ShowTwo"));
            Console.ReadKey();
        }

        static string ShowOne()
        {
            return "Func ShowOne\n";
        }

        static string ShowTwo(string data)
        {
            return data;
        }

 大家試着自己輸出吧  畢竟程序還是要多練的哦


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM