又是一个周末,刚好有时间,又继续复习与总结了,希望能让大家受益,不足之处欢迎指正,谢谢!

十八. 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#学习笔记》知识点总结与摘要四的更多相关文章

  1. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要系列文章索引

    从发表第一篇文章到最后一篇文章,时间间隔有整整一个月,虽只有5篇文章,但每一篇文章都是我吸收<LEARNING HARD C#学习笔记>这本书的内容要点及网上各位大牛们的经验,没有半点废话 ...

  2. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要三

    最近工作较忙,手上有几个项目等着我独立开发设计,所以平时工作日的时候没有太多时间,下班累了就不想动,也就周末有点时间,今天我花了一个下午的时间来继续总结与整理书中要点,在整理的过程中,发现了书中的一些 ...

  3. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要二

    今天继续分享我的阅读<LEARNING HARD C#学习笔记>知识点总结与摘要二,仍然是基础知识,但可温故而知新. 七.面向对象 三大基本特性: 封装:把客观事物封装成类,并隐藏类的内部 ...

  4. 阅读《LEARNING HARD C#学习笔记》知识点总结与摘要一

    本人有幸在Learning Hard举行的整点抢书活动<Learninghard C#学习笔记>回馈网友,免费送书5本中免费获得了一本<LEARNING HARD C#学习笔记> ...

  5. Deep learning with Python 学习笔记(11)

    总结 机器学习(machine learning)是人工智能的一个特殊子领域,其目标是仅靠观察训练数据来自动开发程序[即模型(model)].将数据转换为程序的这个过程叫作学习(learning) 深 ...

  6. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  7. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  8. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  9. Deep learning with Python 学习笔记(7)

    介绍一维卷积神经网络 卷积神经网络能够进行卷积运算,从局部输入图块中提取特征,并能够将表示模块化,同时可以高效地利用数据.这些性质让卷积神经网络在计算机视觉领域表现优异,同样也让它对序列处理特别有效. ...

  10. Deep learning with Python 学习笔记(6)

    本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...

随机推荐

  1. phoenix 开发API系列(三)phoenix api 结合数据库

    概述 介绍了 api 的各种写法之后,下面介绍构建 api 时与数据库连接的方式. 注 下面使用的工程的完整代码已经公开在: http://git.oschina.net/wangyubin/phoe ...

  2. 依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题

    有园友在博问中提了这样一个问题 —— .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题. 比如下面的Razor视图代码: @{ ...

  3. MSBuild 中的 PropertyGroup、ItemGroup 和 ItemMetadata

    在软件项目不断的进展中,MSBuild 脚本可能几个月都不会被修改,因为通常编译和发布的目录是不经常变化的. 但,一旦某天你需要修改了,看到那一堆 $(Something). @(Something) ...

  4. REST建模语言RAML介绍

    原创文章转载请注明出处:@协思, http://zeeman.cnblogs.com   RAML是什么?   RAML是一种简洁的RESTful API描述性语言,它基于 YAML和JSON这样的公 ...

  5. Android多线程分析之四:MessageQueue的实现

    Android多线程分析之四:MessageQueue的实现 罗朝辉 (http://www.cnblogs.com/kesalin/) CC 许可,转载请注明出处 在前面两篇文章<Androi ...

  6. 字符串查找String.IndexOf

    String.indexOf的模拟实现,没想象中有多么高深的查找算法,就是最普通的遍历查找 思路:先找到第一个相同的字符,然后依次比较后面的字符,若都相等则表示查找成功 /** * 查找字符串patt ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程(十五):消息加密

    前不久,微信的企业号使用了强制的消息加密方式,随后公众号也加入了可选的消息加密选项.目前企业号和公众号的加密方式是一致的(格式会有少许差别). 加密设置 进入公众号后台的“开发者中心”,我们可以看到U ...

  8. webservice3

    什么是bottom up 什么是top down 通过浏览器访问如 http://localhost:8080/HelloWS/services/HelloWSsss?wsdl  获取的 wsdl, ...

  9. 基础才是重中之重~方法override详解

    回到 目录 之所以写这篇文章,完全是因为这次代码审核,这次代码审核过程当中,出现了很多我认为基础知识不够扎实的问题,所以,打算把它们记录下来,共大家分享. 方法的override,即方法的覆写或者重写 ...

  10. fir.im Weekly - 进击的 Swift

    最近 Swift 开源了,众开发者们欢呼雀跃.感谢开源,这是最好的时代.本期 fir.im Weekly 准备了一些关于 Swift 的"新鲜"干货分享,也包括一些优秀的 GitH ...