C# 语法特性
C# 2.0
1、泛型(Generics)。
2、泛型方法、泛型委托、泛型接口。
3、泛型约束(constraints)。
4、部分类(partial)。
5、匿名方法。
C#3.0/C#3.5
1、自动属性。
2、隐式推断类型var。 ObjectQuery<>或IQueryable<>。
var 隐式类型的限制:
被声明的变量必须是一个局部变量,而不是静态或实例字段。
变量必须在声明的同时被初始化,因为编译器要根据初始化值推断类型。
初始化的对象不能是一个匿名函数。
初始化表达式不能是null。
语句中只能声明一次变量,声明后不能改变类型。
赋值的数据类型必须是可以在编译时确定的类型。
3、对象集合初始化器。
4、匿名类。
5、扩展方法。
public static class StringUtil
{
public static void WriteSelf(this string strSelf,int year)
{
Console.WriteLine("我是 {0} ,今年是 {1}。", strSelf, year);
}
}
⑴、实例方法由于扩展方法(允许存在同名实例方法和扩展方法)。
⑵、可以在空引用上调用扩展方法。
⑶、可以被继承。
⑷、并不是任何方法都能作为扩展方法使用,必须有以下特征:
它必须放在一个非嵌套、非泛型的静态类中。
它至少有一个参数。
第一个参数必须附加this关键字。
第一个参数不能有任何其他修饰符(out / ref)。
6、系统内置委托 Func / Action 委托使用可变性:协变指的是委托方法的返回值类型直接或间接继承自委托签名的返回值类型,逆变则是参数类型继承自委托方法的参数类型
System.Func,代表有返回类型的委托。
注:输入泛型参数-in最多可以有16个,输出泛型参数-out 只有一个。
System.Action代表无返回类型的委托。
注:最多有16个参数。
System.Predicate<T>代表返回bool类型的委托,用作执行表达式。
System.Comparison<T>代表返回Int类型的委托,用于比较两个参数的大小。
7、Lambda表达式
Lambda表达式中的变量范围:
捕获的变量将不会被作为垃圾回收,直至引用变量的委托超出范围为止。
在外部方法中看不到Lambda表达式内引入的变量。
Lambda表达式无法从封闭的方法中直接捕获ref或out参数。
Lambda表达式中的返回语句不会导致封闭方法返回。
Lambda表达式不能包含其目标位于所包含匿名函数主体外部或内部的goto语句、break语句或、continue语句。
8、Lambda表达式缩(IEnumerable和IQueryable)写推演
new Func<string,int>(delegate(string str) {return str.Length;});
delegate (string str) {str.Length;}
(string str) => {return str.Length;}
(string str)=>str.Length;
(str)=>str.Length;
str=str.Length;
9、标准查询运算符(SQO)
标准查询运算符是定义在System.Linq.Enumerable 类中的50多个为IEnumerable<T> 准备的扩展方法,换句话说IEnumerable<T> 上的每个方法都是一个标准查询运算符,这些方法用来对操作的集合进行查询筛选。
标准查询运算符提供了包括筛选、投影、聚合、排序等功能在内的查询功能。
⑴、筛选集合Where。
⑵、查询投射Select:返回新对象集合IEnumerable<TSource>Select().返回年龄大于等于30岁的人的名字:
⑶、统计数量 int Count()
⑷、多条件排序 OrderBy().ThenBy().ThenBy()
⑸、集合连接Join()
⑹、延迟加载Where
在标准查询运算符中,Where方法就是一个典型的延迟加载案例。在实际的开发中,我们往往会使用一些ORM框架例如EF去操作数据库,Where方法的使用则是每次调用都只是在后续生成SQL语句时增加一个查询条件,EF无法确定本次查询是否已添加结束,所以没有办法在每个Where方法执行的时候确定最终的SQL语句,只能返回一个DbQuery对象,当使用带这个DbQuery对象的时候,才会根据所有条件生成最终的SQL语句去查询数据库。
⑺、即时加载FindAll
在开发中如果使用FindAll方法,EF会根据方法中的条件自动生成SQL语句,然后立即与数据库进行交互获取查询结果,并加载到内存中去。
SQO缺点:语句太庞大复杂。
10、LINQ
C#3.0 新语法,查询表达式和SQL风格接近的代码。以from开始,以select或group by 子句结尾。 输出是一个IEnumerable<T>或IQueryable<T>集合。
C#4.0新特性
1、可选参数和命名参数:
可选参数
⑴、可选参数不能为参数列表的第一个参数,必须位于所有的必须选参数之后(除非没有必选参数);
⑵、可选参数必须指定一个默认值,且默认值必须是一个常量表达式,不能为变量;
⑶、所有可选参数以后的参数都必须是可选参数。
命名参数:通过命名参数调用,实参顺序可以和形参不同。对于简单的重载,可以使用可选参数和命名参数混合的形式来定义方法,提高代码的运行效率。
2、Dynamic特性
Dynamic特性需引用System.Dynamic命名空间: 在方法声明中的params 关键字之后不允许有任何其他参数,并且在方法声明中只允许一个params关键字。
C# 5.0 新特性
1、C#5.0的新特性,最重要的就是异步和等待(async和await),其使用方式特别简单,就是在方法的返回值前面添加关键字async,同时在方法体中需要异步调用的方法前面再添加关键字await。需要注意的是这个异步方法必须以Task或者Task<TResult>作为返回值。
可以参考:
http://www.cnblogs.com/zhili/archive/2013/05/15/Csharp5asyncandawait.html
C# 语法特性的更多相关文章
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- 总结常见的ES6新语法特性
前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...
- C#新语法特性前瞻
今天逛微软的UserVoice site发现了几个有很有用,也很可能被添加到新版C#中的语法,当然也可能被推迟到下一版,拿出来给大家分享一下. 另外还没投票的可以去为自己最想要的新特性投票,有兴趣的可 ...
- 自己动手为PHP7添加新的语法特性
好文章! nikic介绍了如何向PHP添加新的语法特性,原文写的非常精彩,具体是添加in语法功能,使最终实现: <?php $words = ['hello', 'world', 'foo', ...
- 总结常见的ES6新语法特性。
前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数 ...
- atitit.groovy 语法特性
atitit.groovy 语法特性 1. Groovy 1.6概览1 1.1. 多路赋值2 2. 新发布的Groovy2.0为这门语言带来了关键的静态特性:静态类型检查和静态编译:2 3. 参考3 ...
- Atitit.jdk java8的语法特性详解 attilax 总结
Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...
- Delphi 7以来的Delphi 2009测试版新语法特性
我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...
- WEB学习-HTML的基本语法特性
HTML对换行不敏感,对tab不敏感 HTML只在乎标签的嵌套结构,嵌套的关系.谁嵌套了谁,谁被谁嵌套了,和换行.tab无关. 换不换行.tab不tab,都不影响页面的结构. 所以: • <di ...
- 基于.net的分布式系统限流组件 C# DataGridView绑定List对象时,利用BindingList来实现增删查改 .net中ThreadPool与Task的认识总结 C# 排序技术研究与对比 基于.net的通用内存缓存模型组件 Scala学习笔记:重要语法特性
基于.net的分布式系统限流组件 在互联网应用中,流量洪峰是常有的事情.在应对流量洪峰时,通用的处理模式一般有排队.限流,这样可以非常直接有效的保护系统,防止系统被打爆.另外,通过限流技术手段,可 ...
随机推荐
- 《Spring Cloud构建微服务架构》系列博文示例
SpringCloud-Learning 源码下载地址:http://download.csdn.net/detail/k21325/9650968 本项目内容为Spring Cloud教 ...
- 攻防世界 | CAT
来自攻防世界官方WP | darkless师傅版本 题目描述 抓住那只猫 思路 打开页面,有个输入框输入域名,输入baidu.com进行测试 发现无任何回显,输入127.0.0.1进行测试. 发现已经 ...
- [CSP-S模拟测试]:字符消除2(hash+KMP)
题目背景 生牛哥终于打通了“字符消除”,可是他又被它的续集难倒了. 题目传送门(内部题52) 输入格式 第一行$n$表示数据组书.接下来每行一个字符串.(只包含大写字母) 输出格式 每组数据输出一个$ ...
- xunit的assert常用部分方法解释
布尔:True(返回bool的方法或者字段) 判断是否为trueFalse(返回bool的方法或者字段) 判断是否为false 字符串(区分大小写):Equal(期待结果,实际结果) 判断输出值和期待 ...
- Java学习之多线程(定义)
进程:正在运行中的程序线程:负责执行程序的控制单元(执行路径)一个进程中可以有多个执行路径,称之为多线程一个进程中至少要有一个线程 创建新执行线程有两种方式 一.继承Thread类步骤:1.定义一个类 ...
- python排序算法-冒泡和快速排序,解答阿里面试题
''常见的排序算法\ 插入排序/希尔排序/直接排序/堆排序 冒泡排序/快速排序/归序排序/基数排序 给定一个列表,将这个列表进行排序,要求:> 时间复杂度要小于O(n^2) 复杂度:1.时间复杂 ...
- intel instruction 指令速查
参考:http://ref.x86asm.net/ http://ref.x86asm.net/coder32.html
- LightOJ 1418 Trees on My Island (Pick定理)
题目链接:LightOJ 1418 Problem Description I have bought an island where I want to plant trees in rows an ...
- KMP算法——字符匹配
暴力匹配: 假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢? 如果用暴力匹配的思路,并假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置, ...
- Vue 在手机上键盘把底部菜单顶上去的解决方案
Vue 在手机上键盘把底部菜单顶上去的解决方案 ios和安卓的键盘的区别 ios和安卓的键盘的区别弹起方式不同, ios直接弹出键盘, 不影响页面, 而安卓键盘弹起时会把页面顶起来, 这样就会把底部菜 ...