委托

委托也是一种类型,初始化时需要一个方法支持。委托是记录方法信息的一种类型,调用委托时就是调用初始化委托的方法。当委托作为函数参数时,就是将方法作为参数传入,而这种方法可通过Lambda表达式对进行改写,可极大加快编程的灵活性。

简单委托

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Program
{
static void Main(string[] args)
{
// 实例化委托 传入委托方法的方法名 可以不用new
DelegateHello delegateHello = new DelegateHello(Hello);
// 调用委托
// delegateHello.Invoke("委托调用");
delegateHello("委托调用");
}

// 定义委托方法 需要与委托返回值、参数类型相同
static void Hello(string msg)
{
Console.WriteLine("Hello,"+msg);
}

}

// 定义委托 和定义接口中的方法一样,只需要加上 delagate 关键字
delegate void DelegateHello(string msg);

泛型委托

可定义一个委托,用来调用多个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Program
{
static void Main(string[] args)
{
// 直接传递方法名 不用new
// DelegateAdd<int> delegateAddInt = new DelegateAdd<int>(Add);
DelegateAdd<int> delegateAddInt = Add;
delegateAddInt(1, 1);

DelegateAdd<double> delegateAddDouble = Add;
delegateAddDouble(1.5, 1.6);
}

static void Add(int num1,int num2)
{
Console.WriteLine(num2+num1);
}
static void Add(double num1, double num2)
{
Console.WriteLine(num2 + num1);
}
}
// 定义泛型委托
delegate void DelegateAdd<T>(T num1, T num2);

预定义委托

不用事先定义委托就可以使用方法对委托进行初始化,在.net Core中被大量使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Program
{
static void Main(string[] args)
{
// 无返回值 16个
//Action<string, string> action = new Action<string, string>(ConcatStr);
Action<string, string> action = ConcatStr;
action("hello","world");
// 有返回值 17个 前面的string表示输入参数类型 后面最后一个string表示返回结果类型
//Func<string,string> function = new Func<string,string>(PrintStr);
Func<string,string> function = PrintStr
Console.WriteLine(function("hello"));
// Lambda表达式改写
Action<string> action1 = new Action<string>(msg => Console.WriteLine(msg));
action1("Lambda表达改写委托");
}

static void ConcatStr(string str1,string str2)
{
Console.WriteLine(str1+str2);
}
static string PrintStr(string str)
{
return str;
}
}