C#基礎委託回顧

wzh0717發表於2018-09-13

C#基礎委託回顧

前言
  • 快忘記了。
委託的特點
  • 委託類似於 C++ 函式指標,但它們是型別安全的。
  • 委託允許將方法作為引數進行傳遞。
  • 委託可用於定義回撥方法。
  • 委託可以連結在一起;例如,可以對一個事件呼叫多個方法。
  • 方法不必與委託簽名完全匹配。
  • 委託是事件的基礎。

官網介紹

用法
  1. 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;
}
  1. 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}");
}
  1. 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;
}
  1. predicate(bool型的泛型委託)
  • 只能接受一個傳入引數,返回值為bool型別
  • 表示定義一組條件並確定指定物件是否符合這些條件的方法。此委託由 Array 和 List 類的幾種方法使用,用於在集合中搜尋元素
private static bool ProductGT10(Point p)
{
    if (p.X * p.Y > 100000)
    {
        return true;
    }
    else
    {
        return false;
    }
}
  1. Expression<Func<T,TResult>>是表示式
 Expression<Func<int, int, int, int>> expr = (x, y, z) => (x + y) / z;
  1. 委託清理
  • 示例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;
        }
    }
}
  1. 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

相關文章