作為一個初學者,寫下來是當做自己的學習筆記,希望在以后遇到問題的時候能夠快速的找到方法
如果能幫助跟我一樣的新人是更好不過的了 如果有什么不正確或者可以改進的地方也希望大家能夠指出來 謝謝大家
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;
}
大家試着自己輸出吧 畢竟程序還是要多練的哦
