C#基础加强篇---委托、Lamada表达式和事件(中)
2.Lamada表达式
C#共有两种匿名函数:匿名方法和Lamada表达式。在2.0之前的C#版本中,创建委托的唯一方法是使用命名方法。C#2.0中引入了匿名方法,匿名方法就是没有名称的方法。从C#3.0开始,就可以使用一种新语法把实现代码赋予委托——Lamada表达式。
在了解Lamada表达式之前,我们先来了解一下匿名方法。用匿名方法定义委托的语法与之前的没有区别,但在实例化时就有了一些区别。
使用命名方法创建的委托
class Program
{
private delegate void DelSayHi(string name);//定义委托
static void Main(string[] args)
{
Test("张三", SayHelloByChinese);
Test("Zhang San", SayHelloByEnglish);
}
static void Test(string name, DelSayHi del)
{
del(name);
}
static void SayHelloByEnglish(string name)
{
Console.WriteLine("Hello ," + name);
}
static void SayHelloByChinese(string name)
{
Console.WriteLine("你好," + name);
}
}
使用匿名方法创建的委托
class Program
{
private delegate void DelSayHi(string name);//定义委托
static void Main(string[] args)
{
Test("张三", delegate(string name)
{
Console.WriteLine("你好," + name);
});
Test("Zhangsan", delegate(string name)
{
Console.WriteLine("Hello," + name);
});
}
static void Test(string name, DelSayHi del)
{
del(name);
}
}
匿名方法的优点是减少了代码的编写,不必定义仅由委托调用的方法。使用匿名方法时,编译器仍定义了一个方法,该方法只有一个自动指定的名称,我们不需要知道。使用匿名方法时,我们应遵循两条规则:一是在匿名方法中不能使用跳转语句(break,goto或continue)跳到该匿名方法的外部,反之,匿名方法外部的跳转语句不能跳到匿名方法的内部。二是在匿名方法内部不能访问不安全的代码,也不能访问在匿名方法外部使用的ref和out参数,但可以在匿名方法中使用外部定义的其他变量。
好了,我们再来了解Lamada表达式。。。。
若要创建 Lambda 表达式,需要在 Lambda 运算符=>左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。
示例1:
class Program
{
delegate int del(int i);
static void Main(string[] args)
{
del myDelegate = x => x * x;
int j = myDelegate(); //j = 25
Console.WriteLine(j.ToString());
}
}
示例2:
nam
示例3:
static void Main(string[] args)
{
string mid = ",middle part,"; Func<string, string> lamada = (string param) =>
{
param += mid;
param += " end of string.";
return param;
};
Console.WriteLine(lamada("Start of string "));
}
为了简便,示例2和3中name和param的类型string也可以省略不写。只有一个参数,只用写出参数名就行了。如果委托使用多个参数,就把参数名放在括号里。
string mid = ",middle part,";
Func<string,string, string> lamada = (start,end) =>
{
start += mid;
end =start+end;
return end;
};
Console.WriteLine(lamada("Start of string "," end of string."));
还有如果Lamada表达式只有一条语句,在方法块内就不需要花括号和return语句,此时编译器会添加一条隐式的return语句。如示例1,它相当于 del myDelegate = x =>{ return x * x; };如果在Lamada表达式的实现代码中有多条语句,就必须添加花括号和return语句。
有点玩了,先睡觉,事件留到下篇吧。。。。晚安
C#基础加强篇---委托、Lamada表达式和事件(中)的更多相关文章
- C#基础加强篇----委托、Lamada表达式和事件(上)
1.委托 C#的委托相当于C/C++中的函数指针.函数指针用指针获取一个函数的入口地址,实现对函数的操作. 委托与C/C++中的函数指针不同在于,委托是面向对象的,是引用类型,对委托的使用要先定义后实 ...
- C#基础加强篇—委托、Lambda表达式和事件(下)
3.事件 事件作为C#中的一种类型,为类和类的实例定义发出通知的能力,从而将事件和可执行代码捆绑在了一起.事件是对象发送的消息,以发信号通知操作的发生.操作可能是由用户交互引起的,也可能是由某些其他的 ...
- C#编程 委托 Lambda表达式和事件
委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方 ...
- C#学习笔记三(委托·lambda表达式和事件,字符串和正则表达式,集合,特殊的集合)
委托和事件的区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进行调用 是 否 3 是否是一个类型 是 否,事件修饰的是一个对象 public delegate vo ...
- JS基础入门篇(二十)—事件对象以及案例(二)
案例一.点击按钮,选中input中的全部内容 select()方法:选中全部. 点击按钮选中输入框中的内容!!!! <!DOCTYPE html> <html lang=" ...
- Linq学习工具及Lamada表达式
好东西.转载一个.以备学习 Linq学习工具: http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...
- 第8章 委托、Lamdba表达式和事件
本章内容: 委托 Lambda表达式 事件 8.1.3 简单的委托示例 首先定义一个类MathOperations,它有两个静态方法,对double类型的值执行两个操作. public cl ...
- C#基础篇——委托
前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...
- C# 篇基础知识5——委托和事件
事件处理程序是基于“委托”机制运行的. 1.委托 (1)委托的定义和使用 有时需要将一个函数作为另一个函数的参数,这时就要用到委托(Delegate)机制.例如设计一个马戏表演函数: //定义委托 d ...
随机推荐
- 一步步学习Linux多任务编程
系统调用 01.什么是系统调用? 02.Linux系统调用之I/O操作(文件操作) 03.文件描述符的复制:dup(), dup2() 多进程实现多任务 04.进程的介绍 05.Linux可执行文件结 ...
- 设置statusBar状态栏颜色
设置statusBar的[前景部分] 简单来说,就是设置显示电池电量.时间.网络部分标示的颜色, 这里只能设置两种颜色: 默认的黑色(UIStatusBarStyleDefault) 白色(UISta ...
- 代码中jndi数据源的支持
项目中基本都使用Spring框架,支持jndi还是很简单的,只需在spring配置文件中加入 <!-- 使用jndi配置数据源 --> <bean id="dataSour ...
- Python 数组[],元组(),字典{}的异同
序列 Python有6中内建的序列,在这里我们重点讨论两种,数组和元组.所有序列都可以做某些特定的操作,大致上常用的是:加,乘,索引,分片以及检查某个元素是否属于序列的成员. Python还提供一些内 ...
- 十年磨一剑 Delphi再写传奇(不争辩,不解释,十年坚持不懈的努力)
新年伊始,英巴卡迪诺公司(Embarcadero)就在其官网发布了“激动人心的RAD Studio2018年发展规划”公告(见上图).公告中指出,将在于2018年发布10.3.X新版本,新版本兼容Ex ...
- layer弹框在实际项目中的一些应用
官方介绍:layer至今仍作为layui的代表作,受众广泛并非偶然,而是这五年多的坚持,不断完善和维护.不断建设和提升社区服务,使得猿们纷纷自发传播,乃至于成为今天的Layui最强劲的源动力.目前,l ...
- Erlang/OTP 中文手册
http://erldoc.com/ Open Telecom Platform application array asn1rt base64 binary calendar code dbg di ...
- sql数据库时间转换convert
CONVERT CONVERT将某种数据类型的表达式显式转换为另一种数据类型. 严格来说,CONVERT不属于日期处理函数,只是它被经常用于日期处理中,所以这里把它列入了其他日期处理函数,下面是CON ...
- 【BZOJ 1022】 [SHOI2008]小约翰的游戏John
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1022 [题意] [题解] 和这题类似http://blog.csdn.net/harl ...
- Cocos2d-x 脚本语言Lua基本语法
Cocos2d-x 脚本语言Lua基本语法 前面一篇博客对Lua这门小巧的语言进行了简单的介绍.本篇博客来给大家略微讲一下Lua的语法.不会长篇累牍得把Lua的全部语法都讲一遍,这里通过下面几点来讲L ...