程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#委托,事件,匿名委托,

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

編輯:C#入門知識

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

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

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

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

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved