概念了解:
1、什么是匿名委托(匿名方法的简单介绍、为什么要用匿名方法)
2、匿名方法的【拉姆达表达式】方法定义
3、匿名方法的调用(匿名方法的参数传递、使用过程中需要注意什么)
什么是匿名方法?
匿名方法是C#2.0引入的一个新特性,它允许开发者声明自己的函数代码而无须使用委托函数。
C#为委托提供一种机制,可以为委托定义匿名方法,匿名方法没有名称,编译器会定指定一个名称,匿名方法中不能使用跳转语句跳转到该匿名方法的外部,也不能跳转到该方法的内部。也不能在匿名方法外部使用的ref和out参数。
通过使用匿名方法,可以不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。例如,如果创建方法所需的系统开销是不必要的,则指定代码块(而不是委托)可能非常有用。
什么时候该使用匿名方法
C#3.0之后匿名方法可以使用λ表达式来进行定义
无论是拉姆达(lambda)表达式(匿名函数、是匿名类) ,都能归属到一种叫闭包的东西上面。
左边是参数,使用括号表达 (string param),可以是 (param)这样不定义类型,编译器会推断出来,只有一个参数的时候可以不使用括号。右边是实现代码,使用花括号,如果代码只有一行,则不使用花括号和return关键字也可以,编译器会为我们添加。
这是λ表达式的简单实现↓
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
delegate
string
MyDelegate(
string
message);
string
str1 =
"str1"
;
string
str2 =
"str2"
;
MyDelegate my1 = param => param + str1 + str2;
MyDelegate my2 = (
string
param)=>{
return
param + str1 + str2;};
Console.WreiteLine(my(
"param"
))
Console.WreiteLine(my2(
"param"
));
class
Program
{
delegate
void
MyDelegate(
string
message);
static
void
Main(
string
[] args)
{
1.一般的调用命名方法
MyDelegate mydelegate = Write;
//委托
mydelegate +=
delegate
(
string
m)
{
Console.WriteLine(
"{0} this is using delegate"
,m);
};
//拉姆达
mydelegate += (
string
m)=>
{
Console.WriteLine(
"{0} this is using lambda"
,m);
}
mydelegate(
"C#"
);
static
void
Write(
string
message)
{
Console.WriteLine(
"{0} this is using named method"
, message);
}
}
|
使用c# 自带的委托:Action、Action<T>、Func<T>
1
2
3
4
5
6
7
8
9
|
Func<String> func1 = () => {
return
"Func1"
; };
//Func<String> func1 = delegate { return "Func1"; };
Console.WriteLine(func1());
Func<String, String> func2 = m => {
return
m; };
//Func<String, String> func2 = delegate(string m) { return m; };
Console.WriteLine(func2(
"Func2"
));
Func<String,
int
, String> func3 = (
string
m,
int
i) => {
return
m + i; };
//Func<String, int, String> func3 = delegate(string m, int i) { return m + i; };
Console.WriteLine(func3(
"Func"
, 3));
|
Func泛型示意图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
delegate
TResult Func<
out
TResult>();
Func<TResult>
Func<T, TResult>
Func<T1, T2, TResult>
Func<T1, T2, T3, TResult>
Func<T1, T2, T3, T4, TResult>
Func<T1, T2, T3, T4, T5, TResult>
Func<T1, T2, T3, T4, T5, T6, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult>
Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>
|
一个将匿名方方法用于多线程的实例实现参数传递
string
[] Arr =
new
string
[] {
"Thread1"
,
"Thread2"
,
"Thread3"
,
"Thread4"
};
Thread[] Multithreading=
new
Thread[Arr.Length];
for
(
int
i = 0; i < Arr.Length; i++)
{
Multithreading[i] =
new
Thread(
new
ThreadStart(() =>
{
Console.WriteLine(Arr[i]);
}));
Multithreading[i].Start();
}
|
使用Action<T>拓展自己的ForEach
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public
static
IEnumerable<T> Foreach<T>(
this
IEnumerable<T> source, Action<T> func)
{
foreach
(var item
in
source)
{
func(item);
}
return
source;
}
IEnumerable<News> news = db.News.Select(p => p.ID>10).Foreach(p =>
{
p.ID = p.ID + 3;
Console.WriteLine(p.ID);
});
|