委托
委托的意义是把方法像对象一样进行传递,委托可以装载若干个方法,并通过委托对所装载的方法进行调用。
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是一个关键字,用于声明一个事件。
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();//这是无法实现的,会报错
}
}