Unity3D学习资源—委托和lambda表达式一
来源:互联网 发布:守望先锋录制软件 编辑:程序博客网 时间:2024/05/20 16:41
一.在C#中我们可以使用delegate关键字来声明一个委托,声明的格式如下:
delegate <函数返回类型> <委托名> (<函数参数>)
下面我们来看一下代码是如何来写的:
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
namespace
DelegateAndLambda
{
delegate
int
MyDelegate(
int
x,
int
y);
class
MainClass
{
public
static
int
Sum(
int
a,
int
b)
{
return
a + b;
}
public
static
void
Main(string[] args)
{
MyDelegate mydel = Sum;
Console.WriteLine(mydel(2, 3));
}
}
}
从上面的代码我们可以得到如下的结论:
1.在声明委托时有一定的格式,我们就可以把与该委托格式一样的方法名直接赋值给该委托的一个变量;
2.从某种意义上来讲,委托相当于一个方法模版,把与该模版相同的方法赋值给委托变量后,使用委托变量时,本质上来讲就是使用其所绑定的方法;
3.委托变量的使用与方法的使用是一样的,如果有参数,委托变量后面带小括号,里面要加参数,并且个数和类型要一致,如果没有参数,也要加小括号;
(其它三种格式的委托大家可以自己练习试着做一下)
委托不仅可以绑定一个方法,还可以绑定多个方法,如下代码:
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
namespace
DelegateAndLambda
{
delegate
void
Greet(string str);
class
MainClass
{
public
static
void
ChineseGreet(string str)
{
Console.WriteLine(
"早上好!!"
+ str);
}
public
static
void
EnglishGreet(string str)
{
Console.WriteLine(
"Good Morning!!"
+ str);
}
public
static
void
Main(string[] args)
{
Greet greet = ChineseGreet;
greet += EnglishGreet;
greet(
"小李"
);
}
}
}
以上的两个例子,委托在绑定方法时,都会先把方法创建好,下面讲另外两种委托,匿名委托和lambda表达,这样就不用再创建方法了.下面的代码是把上面的例子用匿名委托改写的,代码如下:
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
public
static
void
Main(string[] args)
{
Greet greet = delegate(string str)
{
Console.WriteLine(
"早上好!!"
+ str);
};
greet += delegate(string str)
{
Console.WriteLine(
"Good Morning!!"
+ str);
};
greet(
"小李"
);
}
[C] 纯文本查看 复制代码
1
2
3
4
MyDelegate mydele = delegate(
int
a,
int
b)
{
return
a + b;
};
[C] 纯文本查看 复制代码
1
2
3
4
5
MyDelegate mydele = ((
int
a,
int
b) =>
{
return
a + b;
});
Console.WriteLine(mydele(2, 3));
二.上面的例子我们看到,定义的委托都是在类外面,名字空间下面的,所有的类都可以用该委托,这与我们讲的面向对象的三大特性封装是相违背的,但是当我们把一个委托放到类里面时,不管该委托前面有没有用public访问修饰符修饰,在类的外面都是取不到的.此时就需要使用event关键字,首先在类里面先声明一个委托,然后在类里面定义一个委托的变量,前面用event来修饰,这样在类的外面就可以直接拿到委托变量了,然后就能够绑定方法了,但绑定方法时,全部要进行+=操作,这一点与上面的例子有点不同,具体的使用方法如下:
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class
MainClass
{
public
delegate
void
Greet(string str);
public
event Greet greet;
public
static
void
ChineseGreet(string str)
{
Console.WriteLine(
"早上好!!"
+ str);
}
public
static
void
EnglishGreet(string str)
{
Console.WriteLine(
"Good Morning!!"
+ str);
}
public
static
void
Main(string[] args)
{
MainClass mc =
new
MainClass();
mc.greet += ChineseGreet;
mc.greet += EnglishGreet;
mc.greet(
"小李"
);
}
}
三.把一个方法赋值给一个委托变量的这种机制,可以实现把方法当做参数进行传递,如果一个方法,其参数是一个委托,则调用该方法时,就可以把与该委托格式一样的方法传给形参.下面的代码以List集合类型里面的RemoveAll方法为例:
[C] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
List<
int
> list =
new
List<
int
>();
list.Add(123);
list.Add(123);
list.Add(234);
list.Add(123);
list.RemoveAll((
int
a) =>
{
if
(a == 123)
{
return
true
;
}
return
false
;
});
foreach (
int
s in list)
{
Console.WriteLine(s);
}
0 0
- Unity3D学习资源—委托和lambda表达式一
- Unity3D学习资源—委托和lambda表达式二
- c#委托和lambda表达式(一)
- 委托和Lambda表达式(一):委托概述
- 委托、Lambda表达式和事件
- 委托,Lambda表达式和事件
- 委托、Lambda表达式和事件
- 委托,lambda表达式和事件
- 委托、Lambda表达式和事件
- 委托、匿名委托和lambda表达式
- [深入学习C#]匿名函数、委托和Lambda表达式
- 学习笔记--委托,Lambda表达式和事件(1)
- 学习笔记--委托,Lambda表达式和事件(2)
- C#高级学习第二章委托,Lambda表达式和事件
- Java8学习:Lambda表达式、Stream API和功能性接口 — 教程、资源、书籍和实例
- 详解C#委托、时间和Lambda表达式
- 解析C#委托、时间和Lambda表达式
- 委托和匿名方法、lambda表达式
- 基于HI3518E的wifi门铃方案
- 配置rnnlib(刚刚配置完成)
- ACM/IPCP新生入门指南
- 运用ocropy时报numpy.dot() fails when using keyword argument "out"的错误
- npoi读写excel导致excel文件格式损坏
- Unity3D学习资源—委托和lambda表达式一
- 创建dialog时传入content的错误
- 导航栏,设置块对象
- Android webview使用详解
- DCOM配置
- ios fiddler调试环境配置
- eth0:01的意思
- UVa 12563:Jin Ge Jin Qu hao(DP)
- SpringMVC传参数一