C# 委托(Delegate)

在本章中,我们将深入探讨 C# 中的委托(Delegate)概念。委托是 C# 中一种非常重要的类型,它允许我们传递方法作为参数,并且可以用来表示回调方法。委托的使用使得代码更加灵活和可重用。

什么是委托?

委托是一种引用类型,用于封装具有特定签名的方法。换句话说,委托是对方法的抽象,它可以被赋值给一个变量或作为参数传递给其他方法。委托使得我们可以像处理数据一样处理方法,从而实现了方法的动态绑定。

基础示例

让我们通过一个简单的例子来理解委托的基本概念:

-- -------------------- ---- -------
----- -------

-- --------
------ -------- ---- --------------------- ---------

----- -------
-
    ------ ---- ------
    -
        -- ------------------
        -------------- -------------- - ---------
        
        -- ----
        ---------------------- ---------
    -

    -- ----------
    ------ ------ ---- --------------- --------
    -
        ---------------------------
    -
-

在这个例子中,SimpleDelegate 是一个自定义的委托类型,它的签名与 SayHello 方法一致。我们创建了一个 SimpleDelegate 类型的实例,并将它指向了 SayHello 方法,然后调用了这个委托。

委托的签名

委托的签名决定了它可以引用的方法的类型。签名包括返回类型和参数列表。下面是一个更复杂的委托示例,它接受两个整数并返回它们的和:

-- -------------------- ---- -------
----- -------

------ -------- --- ----------------- -- --- ---

----- -------
-
    ------ ---- ------
    -
        ------------- --- - -----------
        --- ------ - ------ ---
        --------------------------- -----------
    -

    ------ ------ --- -------------- -- --- --
    -
        ------ - - --
    -
-

在这个例子中,MathOperation 委托定义了一个接受两个整数并返回一个整数的方法签名。我们创建了一个 MathOperation 类型的实例,并将其指向 AddNumbers 方法,然后通过这个委托调用了该方法。

多播委托

多播委托是指一个委托实例可以引用多个方法。当调用一个多播委托时,所有被引用的方法都会按顺序执行。多播委托使用 +-= 操作符来添加或移除方法。

示例

-- -------------------- ---- -------
----- -------

------ -------- ---- --------------------

----- -------
-
    ------ ---- ------
    -
        ----------------- ----------------- - --------
        ----------------- -- --------
        ----------------- -- --------
        
        --------------------
    -

    ------ ------ ---- ---------
    -
        ------------------------- ----
    -

    ------ ------ ---- ---------
    -
        ------------------------- ----
    -

    ------ ------ ---- ---------
    -
        ------------------------- ----
    -
-

在这个例子中,我们创建了一个 MultiCastDelegate 委托实例,并使用 += 操作符向其中添加了三个方法。当我们调用这个委托时,这三个方法会依次执行。

内置委托类型

除了自定义委托外,C# 还提供了一些内置的委托类型,如 Action, FuncPredicate。这些内置委托类型提供了更简洁的方式来处理常见的方法签名。

Action 委托

Action 委托用于没有返回值的方法。根据参数的数量,有多种 Action 类型,例如 Action, Action<T>, Action<T1,T2> 等。

-- -------------------- ---- -------
----- -------

----- -------
-
    ------ ---- ------
    -
        ----------- ----------- - ------
        ----------------
    -

    ------ ------ ---- --------- -------
    -
        --------------------------
    -
-

Func 委托

Func 委托用于有返回值的方法。同样地,根据参数的数量,有多种 Func 类型,例如 Func<T>, Func<T1,T2,TResult> 等。

-- -------------------- ---- -------
----- -------

----- -------
-
    ------ ---- ------
    -
        --------- ---- ---- -------- - ----------------
        --- ------ - ----------- ---
        --------------------------- -----------
    -

    ------ ------ --- ------------------- -- --- --
    -
        ------ - - --
    -
-

Predicate 委托

Predicate 委托用于布尔返回值的方法,通常用于条件判断。

-- -------------------- ---- -------
----- -------

----- -------
-
    ------ ---- ------
    -
        -------------- ------ - -------
        ---- ------ - ----------
        ---------------------- - ----- -----------
    -

    ------ ------ ---- ---------- -------
    -
        ------ ------ - - -- --
    -
-

总结

通过本章的学习,你应该对 C# 中的委托有了深入的理解。委托不仅可以帮助我们更好地组织代码,还极大地增强了代码的灵活性和可重用性。无论是在事件处理还是异步编程中,委托都扮演着重要的角色。希望你能够利用这些知识来解决实际问题,并在项目中合理应用委托。

纠错
反馈