一. 委托定義
1. 委托與多播委托
委托型別表示對具有特定引數串列和回傳型別的方法的參考,定義了委托實體可以呼叫的某類方法, 通過委托,我們可以動態的通過委托變數來呼叫委托方法,用delegate來命名委托型別,
委托實體則是指將方法賦值給委托變數的程序,
多播委托是指一個委托實體可以參考一組委托方法,需要用+或+=來添加委托方法,也可以用-或-=來減去右邊的委托方法,當然對單個委托方法使用-號等于將NULL賦值給委托變數,
2. 實體方法
當委托的物件為實體方法時,不僅會保留對方法的參考,也可以保留對方法實體的參考,
3. 泛型委托型別
委托型別也可以包含泛型委托引數,(泛型是很重要的概念,后面會專門再寫一下)
public delegate T GenericDelagete(T arg);
4. 暫定
二. 例子
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,靜態方法回傳值為Null
Num.Tran1<int>(c, Square);//使用泛型型別的委托呼叫靜態方法
foreach (int i in c)
{
Console.WriteLine($"{i}");//用$可以不用占位符
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/233575.html
標籤:其他
上一篇:DynamicPlanning
