阅读《LEARNING HARD C#学习笔记》知识点总结与摘要四
又是一个周末,刚好有时间,又继续复习与总结了,希望能让大家受益,不足之处欢迎指正,谢谢!
十八. Lambda
1.Lambda表达式:匿名方法的另一种表现形式,它可以包含表达式和语句,且用于创建委托或转换为表达式树,定义语法:(形参列表)=>{方法体}; 单个参数时,可以省略括号
2.Lambda表达式树是用来表示Lambda表达式逻辑的一种数据结构,它将代码表示成一个对象树,而非可执行的代码,定义语法如(a+b):
Experssion<Func<int,int,int>> (a,b)=>a+b;
通过代码动态构造Lambda表达式树,如下:
parameterExpression a=Expression.Parameter(typeof(int),”a”); parameterExpression a=Expression.Parameter(typeof(int),”b”); BinaryExpression body=Expression.Add(a,b); Experssion<Func<int,int,int>> exprTree=Expression.Lambad(body,a,b);
3.Lambda表达式树通过调用Compile方法将表达式树转换为可执行代码(即所表示的委托)
十九.扩展方法
1.扩展方法是一种方法,它用来扩展已知类型的方法成员(即在不改变原有类型的前提下,附加新的方法);
2.扩展方法定义规则:
a)必须在一个非嵌套、非泛型的静态类(即标准的静态类)中定义;
b)它至少要有一个参数;
c)第一个参数必须在类型加上this关键字,表示向该参数对应的类型就进扩展;
d)第一个参数不能使用任何修饰符(如:不能使用rel,out)
e)第一个参数的类型不能是指针类型;
3.扩展方法定义语法如下:
static class 静态类名
{
public static 返回类型 扩展方法名(this 目标扩展类型 形参名,其它形参…)
{
//方法体
}
}
4.空引用(NULL)支持调用扩展方法
注意:定义扩展方法时,为防止方法污污染(即扩展的方法在某些类型中并无实际作用或不需要),应尽量扩展具体类型,而不要扩展其基类
二十.LINQ
1.LINQ,即语言集成查询,提供一种跨越各种数据源的统一的查询方式
2.LINQ查询表达式必须以from子句开头,并且必须以select或group子句结尾,在第一个from子句与最后一个select或group子句之间可以包含多个子包,定义语法如下:
Var query=from n in numbers where n<=10 select n;
3.LINQ查询表达式是建立在Lambda表达式和扩展方法的基础上的,而Lambda表达式又是建立在委托的基础上的,扩展方法也属于方法,所以LINQ的本质还是对方法的调用,对于编译器而言,使用LINQ查询表达式与使用方法调用的代码完全相同。
二十一.C#4.0新特性
可选参数:指定了默认值的参数,即在调用方法时,该参数可以指定实参,也可以不指定实参,若不指定则采用默认值;
注意:1.可选参数必须在非可选参数的后面;2.默认值必须为常量;3.不定参数(即用params表示的参数数组)不能为可选参数;4.用rel或out标识的参数不能为可选参数;
命名实参:即在调用方法时,直接指定形参名并为其赋值(指定实参),可不按方法形参的顺序,且非可选参数必需全部指定实参,使用语法如下:
static void Write(DateTime dt,string name,string result="www.zuowenjun.cn")
{
Console.Write("{0}-{1}-{2}", dt, name, result);
} //调用方法
Write(name: "梦在旅途", dt: DateTime.Now);
动态类型:即用dynamic关键字来表示某个变量的类型,动态类型可不用编写显式强制转换的代码,强制转换由编译器来完成;定义语法如下:
dynamic d=10;dynamic str=”www.zuowenjun.cn”; dynamic p=new People();
注意:1.不能直接用动态类型作为实参来调用扩展方法;2.委托与动态类型间不能做隐式转换;3.不能调用构造函数或静态方法;4.不能将动态类型dynamic作为基类声明,也不能作为泛型类型参数的约束
二十二.多线程
1.线程与进程关系:线程是进程的执行单元,操作系统通过调度线程来使应用程序工作,而进程则是线程的容器,它是由操作系统创建,又在具体的执行过程中创建了线程;一个进程至少包含一个线程。
2.线程分前台线程与后台线程之分,在同一个线程中,若所有前台线程结束后,CLR会强制强结束仍在运行的所有后台线程,这些后台线程被直接终止,却不会抛出任何异常。主线程一定是前台线程。线程的创建语法如下:
Thread 线程变量名=new Thread(委托实例);
线程变量名.IsBackgroud=true; //为true则表示为后台线程,否则为前台前线程
线程变量名.Start();//启动线程
3.线程池:是指存放应用程序中要使用的线程的集合,若要使用线程池中的线程,需要调用静态方法:ThreadPool.QueueUserWorkItem
4.线程同步:确保某一时间只有一个线程在操作共享资源,实现线程同步的方法:
a)监视器Monitor、lock,使用代码如下:
private static object syncObj = new object();//类的静态字段
try
{
Monitor.Enter(syncObj);
//其它代码
}
finally
{
Monitor.Exit(syncObj);
} lock(syncObj) //为上面代码的简写形式
{
//执行代码
};
b)Mutex对象,Mutex是跨进程的,因此我们可以在同一台机器甚至远程的机器上的多个进程上使用同一个互斥体,使用代码如下:
Mutex mt=new Mutex();
mt.WaitOne();//等待
//执行代码
mt.ReleaseMutex();//释放
c) ReaderWriterLock类型,用ReaderWriterLock进行资源访问时,如果在某一时刻资源并没有获取写的独占权,那么可以获得多个读的访问权,单个写入的独占权,如果某一时刻已经获取了写入的独占权,那么其它读取的访问权必须进行等待,使用语法如下:
static ReaderWriterLock rwLock = new ReaderWriterLock();//类的静态字段
rwLock.AcquireWriterLock(1000);
//执行代码
rwLock.ReleaseWriterLock();
d)还有SynchronizationAttribute、MethodImplAttribute、同步事件和等待句柄等,具体每种用法可参见该篇博文:
http://www.cnblogs.com/michaelxu/archive/2008/09/20/1293716.html
阅读《LEARNING HARD C#学习笔记》知识点总结与摘要四的更多相关文章
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引
从发表第一篇文章到最后一篇文章,时间间隔有整整一个月,虽只有5篇文章,但每一篇文章都是我吸收<LEARNING HARD C#学习笔记>这本书的内容要点及网上各位大牛们的经验,没有半点废话 ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要三
最近工作较忙,手上有几个项目等着我独立开发设计,所以平时工作日的时候没有太多时间,下班累了就不想动,也就周末有点时间,今天我花了一个下午的时间来继续总结与整理书中要点,在整理的过程中,发现了书中的一些 ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要二
今天继续分享我的阅读<LEARNING HARD C#学习笔记>知识点总结与摘要二,仍然是基础知识,但可温故而知新. 七.面向对象 三大基本特性: 封装:把客观事物封装成类,并隐藏类的内部 ...
- 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要一
本人有幸在Learning Hard举行的整点抢书活动<Learninghard C#学习笔记>回馈网友,免费送书5本中免费获得了一本<LEARNING HARD C#学习笔记> ...
- Deep learning with Python 学习笔记(11)
总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...
- Deep learning with Python 学习笔记(10)
生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...
- Deep learning with Python 学习笔记(9)
神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...
- Deep learning with Python 学习笔记(8)
Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...
- Deep learning with Python 学习笔记(7)
介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...
- Deep learning with Python 学习笔记(6)
本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...
随机推荐
- 奇妙的动态代理:EF中返回的对象为什么序列化失败
今天有如鹏的学生遇到一个问题:把一个对象保存到Session中(进程外Session)后,Web服务器重启,当从Session读取这个对象的时候报错,提示是一个“T_Users”后面跟着一大串数字的类 ...
- DataTables 控件使用和心得 (1) - 入门
什么是DataTables DataTables是一个基于HTML/CSS/JavaScript的前端列表组件. 基于JQuery 开源并且免费(除特殊支持服务) 主要特色: 高性能,响应式,功能完整 ...
- 介绍Oedis - Redis OH/RM
作死造轮子 Oedis是近段时间为了解决日志型数据如何与Entity Framework的查询整合的问题写的一个Redis的OH /RM.虽然Redis出来蛮久了,各路高手也都提出了实践方案,但是或许 ...
- Linux3:more、which、find、chmod、tar、diff、grep、ps、netstat、uname
more 类似cat,不过more不是将整个文件内容从上到下显示在屏幕上的,而是以一页一页的显示方便使用者逐页阅读.more最基本的指令就是space即往下翻一页,b即往回翻一页显示,而且还有搜索字符 ...
- 补充 作业八:团队项目——Alpha阶段项目总结 补充
游戏界面: 单一.无背景图片 加入了背景 游戏结束: 无变化 无变化 游戏记录 无 加入数据库:有数据记录! 游戏初始化: 无 加入多种模式 此次任务后的总结: 经过上一次的答辩,以及认真观看了其他组 ...
- 程序员必须知道的几个Git代码托管平台
上一篇博客中2015继续任性——不会Git命令,照样玩转Git我们简单的介绍了在VS2013中使用Git,和GitHub客户端的使用.那么使用Git到底有什么好处呢?最为明显的是支持Git代码托管的平 ...
- Hibernate的Annotation注解
当项目变得比较大的时候,如何还使用hbm.xml文件来配置Hibernate实体就会变得比较复杂.这里Hibernate提供了Annotation注解方式,使得Hibernate的映射文件变得很方便管 ...
- 手把手教你用python打造网易公开课视频下载软件4-图形化界面
上一篇讲解完函数:def getdownLoadInfo (url): 传入公开课的url地址,就可以提取课程的信息,这一篇讲解一下如何编写图像化界面.大概思考一下图像化界面需要的内容: (1)一个标 ...
- 使用ViwePager显示图片时如何防止内存泄露。
内存泄露的检测. 1. 在Android Studio中运行你的应用,然后切换到输出窗口的Android tab. 2. 尽情的玩耍你的应用,最好各个功能都用到,如果是Viewpager,则多滑动一些 ...
- 说说设计模式~门面模式(Facade)
返回目录 门面模式(Facade)属于结构型模式的一种,它符合面向对象的封装原则,但又不符合开闭原则,呵呵,今天我们主要说它的优点,不谈缺点. 定义 门面模式,是指提供一个统一的接口去访问多个子系统的 ...