C# 委托与事件

LiFasT
LiFasT
Published on 2024-10-25 / 87 Visits
0
0
#C#

委托

委托的意义是把方法像对象一样进行传递,委托可以装载若干个方法,并通过委托对所装载的方法进行调用。

Delegate

最基础的委托,在定义自己所使用的委托前需要定义一个委托类型,定义委托类型方法如下:

public delegate [返回值] [委托名](参数列表);

定义要使用委托如下:

public [如上定义的委托名] [要使用的委托名];

下面是一个使用示例:

public class Ex1
{
    public delegate void MyDelegate();
    public MyDelegate _mydelegate;
    public void Main()
    {
        _mydelegate += PrintHello;
        _mydelegate += PrintEnd;
        _mydelegate?.Invoke();
    }
    public void PrintHello()
    {
        Console.WriteLine("Hello");
    }
    public void PrintEnd()
    {
        Console.WriteLine("End");
    }
}

Action

Action是不带返回值的委托,不需要像上面一样定义一个委托类型,Action的定义方法如下:

public Action<参数类型列表> [Action名];

public class Ex2
{
    //Action无返回值委托
    public Action _myAction;
    public Action<string> _myAction2;
    public void Main()
    {
        _myAction += PrintHello;
        _myAction += PrintEnd;
        _myAction2 = PrintInput;

        _myAction?.Invoke();
        _myAction2?.Invoke("Input Content");
    }
    public void PrintHello()
    {
        Console.WriteLine("Hello");
    }
    public void PrintEnd()
    {
        Console.WriteLine("End");
    }
    public void PrintInput(string input)
    {
        Console.WriteLine(input); 
    }
}

Func

Func是带返回值的委托,Func的定义方法如下:

public Func<参数类型列表,返回值类型> [Func名];

与Action不同,Func需要在<>的最后写明返回值的类型。

public class Ex3
{
    //Func有返回值委托
    public Func<string> _myFunc;
    public Func<string, string> _myFunc2;
    public void Main()
    {
        _myFunc += PrintHello;
        _myFunc += PrintEnd;
        _myFunc2 = Rename;
        Console.WriteLine(_myFunc.Invoke());
        Console.WriteLine(_myFunc2.Invoke("Jack"));
    }
    public string PrintHello()
    {
        Console.WriteLine("Hello Inside");
        return "Hello";
    }
    public string PrintEnd()
    {
        Console.WriteLine("End Inside");
        return "End";
    }
    public string Rename(string input)
    {
        return input + " => New Name";
    }
}

使用匿名函数和Lambda表达式

使用匿名函数和Lambda表达式可以让代码更加简洁,对于只使用一次的方法,这种方式特别适用。

匿名函数的使用方法:

[委托] = delegate(参数列表) {};

Lambda表达式的使用方法:

[委托] = (参数列表) => {};

以上的参数列表可以不带参数类型,如果只有一行,花括号可以省略。

public class Ex4
{
    //运用匿名函数和Lambda表达式
    public Action<string> _myAction;
    public Action<string> _myAction2;
    public Func<string, string> _myFunc;
    public Func<string, string> _MyFunc2;
    public void Main()
    {
        //匿名函数(无返回值)
        _myAction = delegate (string input)
        {
            Console.WriteLine(input);
        };
        _myAction?.Invoke("匿名函数");

        //Lambda表达式(无返回值)
        _myAction2 = (input) => Console.WriteLine(input);
        _myAction2?.Invoke("Lambda表达式");

        //匿名函数(有返回值)
        _myFunc = delegate (string input)
        {
            return input + " => 返回值";
        };
        Console.WriteLine(_myFunc?.Invoke("匿名函数"));

        //Lambda表达式(有返回值)
        _MyFunc2 = (input) => input + " => 返回值";
        Console.WriteLine(_MyFunc2?.Invoke("Lambda表达式"));

    }
}

事件

事件event是一个关键字,用于声明一个事件。

参考内容:微软event关键字

public class Ex5
{
    public event Action _myAction;
    public void Main()
    {
        _myAction = () => Console.WriteLine("带event的Action");
        _myAction?.Invoke();
    }
}
internal class Program
{
    static void Main(string[] args)
    {
        Ex5 ex5 = new Ex5();
        ex5.Main();
		ex5._myAction?.Invoke();//这是无法实现的,会报错
    }
}


Comment