C 基礎委托回顧 前言 快忘記了。 委托的特點 委托類似於 C++ 函數指針,但它們是類型安全的。 委托允許將方法作為參數進行傳遞。 委托可用於定義回調方法。 委托可以鏈接在一起;例如,可以對一個事件調用多個方法。 方法不必與委托簽名完全匹配。 委托是事件的基礎。 "官網介紹" 用法 1. dele ...
C#基礎委托回顧
前言
- 快忘記了。
委托的特點
- 委托類似於 C++ 函數指針,但它們是類型安全的。
- 委托允許將方法作為參數進行傳遞。
- 委托可用於定義回調方法。
- 委托可以鏈接在一起;例如,可以對一個事件調用多個方法。
- 方法不必與委托簽名完全匹配。
- 委托是事件的基礎。
用法
- delegate
- 至少0個參數,至多32個參數,可以無返回值,也可以指定返回值類型
- 示例:
public delegate Int32 ComputeDelegate(Int32 a, Int32 b);
private static Int32 Compute(Int32 a, Int32 b)
{
return a + b;
}
public delegate Int32 ComputeDelegate2(Int32 a, Int32 b);
//delegate參數
private static Int32 ReceiveDelegateArgsFunc(ComputeDelegate2 func)
{
return func(1, 2);
}
private static Int32 DelegateFunction(Int32 a, Int32 b)
{
return a + b;
}
- Action(無返回值的泛型委托)
- Action可以接受0個至16個傳入參數,無返回值
- 示例:
public static void TestAction<T>(Action<T> action, T t)
{
action(t);
}
private static void Printf(string s)
{
Console.WriteLine($"3、{s}");
}
private static void Printf(int s)
{
Console.WriteLine($"3、{s}");
}
- Func<T,TResult> 是有返回值的泛型委托
- 封裝一個具有一個參數並返回 TResult 參數指定的類型值的方法
- public delegate TResult Func<in T, out TResult>(T arg)
- 可以接受0個至16個傳入參數,必須具有返回值
public static int TestFunc<T1, T2>(Func<T1, T2, int> func, T1 a, T2 b)
{
return func(a, b);
}
private static int Fun(int a, int b)
{
return a + b;
}
- predicate(bool型的泛型委托)
- 只能接受一個傳入參數,返回值為bool類型
- 表示定義一組條件並確定指定對象是否符合這些條件的方法。此委托由 Array 和 List 類的幾種方法使用,用於在集合中搜索元素
private static bool ProductGT10(Point p)
{
if (p.X * p.Y > 100000)
{
return true;
}
else
{
return false;
}
}
- Expression<Func<T,TResult>>是表達式
Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
- 委托清理
- 示例1:迴圈依次迴圈
public ComputeDelegate OnDelegate;
public void ClearDelegate()
{
while (OnDelegate != null)
{
OnDelegate -= OnDelegate;
}
}
- 示例2:利用GetInvocationList方法
static void Main(string[] args)
{
Program2 test = new Program2();
if (test.OnDelegate != null)
{
Delegate[] dels = test.OnDelegate.GetInvocationList();
for (int i = 0; i < dels.Length; i++)
{
test.OnDelegate -= dels[i] as ComputeDelegate;
}
}
}
- sample
static void Main(string[] args)
{
ComputeDelegate computeDelegate = new ComputeDelegate(Compute);
Console.WriteLine($"1、sum:{computeDelegate(1, 2)}");
ComputeDelegate2 computeDelegate2 = new ComputeDelegate2(DelegateFunction);
Console.WriteLine($"2、sum:{ReceiveDelegateArgsFunc(computeDelegate2)}");
TestAction<String>(Printf, "action");
TestAction<Int32>(Printf, 12);
TestAction<String>(x => { Printf(x); }, "hello action!");//Lambda
Console.WriteLine($"4、{ TestFunc(Fun, 1, 2)}");
Point[] points = {
new Point(100, 200),
new Point(150, 250),
new Point(250, 375),
new Point(275, 395),
new Point(295, 450) };
Point first = Array.Find(points, ProductGT10);
Console.WriteLine($"5、 X = {first.X}, Y = {first.Y}");
Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
Console.WriteLine($"6、{expr.Compile()(1, 2, 3)}");
Console.WriteLine("Press any key...");
Console.ReadKey();
}
C#委托介紹
Expression