C# —— 深入理解委托类型
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C# —— 深入理解委托类型
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                一. 委托定義
1. 委托與多播委托
委托類型表示對具有特定參數列表和返回類型的方法的引用,定義了委托實例可以調用的某類方法。 通過委托,我們可以動態的通過委托變量來調用委托方法。一般用delegate來命名委托類型,但Action和Func也可以達到同樣的效果,而且不用聲明委托。
 委托實例則是指將方法賦值給委托變量的過程。
 多播委托是指一個委托實例可以引用一組委托方法,需要用+或+=來添加委托方法,也可以用-或-=來減去右邊的委托方法,當然對單個委托方法使用-號等于將NULL賦值給委托變量。
2. 實例方法
當委托的對象為實例方法時,不僅會保留對方法的引用,也可以保留對方法實例的引用。
3. 泛型委托類型
委托類型也可以包含泛型委托參數。(泛型是很重要的概念,后面會專門再寫一下)
 public delegate T GenericDelagete< T >(T arg);
4. Action
Action是系統內置類型(預定義)的一個委托類型, 沒有返回值,但是可以通過在Action后面聲明泛型來指定方法的參數類型.
 Action<int, string> c;
 Action<in T1,in T2 … ,in T16>
5. Func
Func 封裝了一個不一定具有參數但卻返回參數指定的類型值的方法。
class Program{static void Main(string[] args){Func<double, double, double> Domulti = calculate.multi;double result = Domulti(13, 14);Console.WriteLine("相乘:{0}", result);calculate c = new calculate();Action<double, double> DoSubstraction = c.substraction;DoSubstraction(521, 1);}}class calculate{public static double multi(double x, double y){return x * y;}public void substraction(double x, double y){Console.WriteLine("相減:{0}", x - y);}}二. 例子
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 委托 {delegate int Transformer(int a);//定義一個int類型的委托類,只能調用int類型的方法。public delegate T Tran<T>(T arg);//定義一個泛型委托類型class Num //創建一個類,定義一個Tranform方法,可以遍歷數組值,并將數組值賦給委托方法。{public static void Tranform(int[] values, Transformer d){for (int i = 0; i < values.Length; i++){values[i] = d(values[i]);//將數組的值賦給委托方法}}public int IP(int per){Console.WriteLine(per);return per;}public static void Tran1<T>(T[] values,Tran<T> t){for (int i = 0; i < values.Length; i++){values[i] = t(values[i]);//將數組的值賦給委托方法}}}public class Program{static int Square(int x){int r= x* x;//定義Square方法,求平方Console.WriteLine(r);return r;}static int Cube(int x){ int r= x* x *x;//定義Cube方法,求立方Console.WriteLine(r);return r;}static void Main(){int b;int[] c = {1,2,3 };Transformer e =null;e += Square;//加委托方付//Transformer e = new Transformer(Square); //建立委托實例,也可簡寫成Transformer e = Square;e += Cube;//e -= Square;//減委托方法b = e(3);//等同于b= e.Invoke(3);Num.Tranform(c, Square);//調用Tranform,其中可見可以直接引用Square方法foreach (int i in c){Console.WriteLine($"{i}");//用$可以不用占位符}Num n = new Num(); //委托對象為實例化方法Transformer f = n.IP; //建立委托實例f(3);Console.WriteLine(f.Target ==n); //實例方法返回Ture,靜態方法返回值為NullNum.Tran1<int>(c, Square);//使用泛型類型的委托調用靜態方法foreach (int i in c){Console.WriteLine($"{i}");//用$可以不用占位符}}} }總結下過程:
最近看到一個講的特別好:
C#中的委托和事件 - Part.1
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的C# —— 深入理解委托类型的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Appium 1.21.x 百度网盘下载
- 下一篇: 使用openlayers投影阿伯斯(Al
