C#复习笔记-委托

发布时间 2023-04-02 22:51:10作者: 放羊娃

     委托是一种引用类型,委托定义了了一类可以被委托实例调用的方法。它定义了方法的返回值类型和参数类型。定义了一个名为FeedBack的委托,返回一个int类型的值,带有一个int类型的参数。可以将任何类型或者结构中与委托类型匹配的方法传递给委托,可以是静态方法也可以是实例方法。如下: 

FeedBack fd = MyDelegate.FeedBackToConsole;
fd(1);
internal delegate void FeedBack(int value);
internal class MyDelegate
{
       internal static void FeedBackToConsole(int value)
    {
        Console.WriteLine("item=" + value);
    }
}

  委托(delegate)提供了一种回调函数的机制,将委托当做参数传递给另外一个方法。委托的回调方法是类型安全的。如下的例子中定义了一个返回值为void的委托FeedBack,委托指定的方法接收一个int类型的参数。MyDelegate类定义了一个静态方法Counter,这个方法接收from,to两个int类型的参数和一个 FeedBack类型的委托fb,他是一个FeedBack委托对象的引用。如果fb的变量不为null,就调用由fb变量指定的回调方法。

FeedBack(MyDelegate.FeedBackToConsole);
MyDelegate.Counter(1, 5, fd);
internal delegate void FeedBack(int value);
internal class MyDelegate
{
    internal static void Counter(int from, int to, FeedBack fb)
    {
        for (int val = from; val < to; val++)
        {
            if (fb != null)
                fb(val);
        }
    }

    /// <summary>
    /// 回调方法
    /// </summary>
    /// <param name="value"></param>
    internal static void FeedBackToConsole(int value)
    {
        Console.WriteLine("item=" + value);
    }
}

 委托可以调用多个方法,称为多播委托。使用加法运算符或加法赋值运算符(“+”或“+=”)像委托列表添加新的方法,使用减法运算符或减法赋值运算符(- 或 -=)删除委托列表中的方法。委托会按照添加的顺序依次触发。如果一个多播委托拥有费void类型的返回值,则调用者从最后一个触发的方法接收返回值。

MyDelegate d = MyDelegateMethod.Method1;
d += MyDelegateMethod.Method2;
d = d - MyDelegateMethod.Method2;

public delegate void MyDelegate(int p);
internal class MyDelegateMethod
{
    internal static void Method1(int value)
    {
        Console.WriteLine("item=" + value);
    }
    internal static void Method2(int value)
    {
        Console.WriteLine("item=" + value);
    }
}

     委托可以包含泛型类型的参数:

public delegate T OtherDelegate<T>(T p);

Func和Action委托 

     Action是无返回值的泛型委托,Action<int,int> 表示定义一个无返回值接收2个int类型的参数的委托。

    Func是有返回值的泛型委托,Func<int>表示定义一个无参数,返回值为int类型的委托。Func<String,int>表示接收一个String类型参数,返回值为int的委托。