转:http://www.cnblogs.com/lhking/p/3660182.html
内容如下:
据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework 4.5.1。
从Visual Studio的更新规律上来看,微软2或者3年,更新增加的东西会比较多,所以对于C# 6.0,还是有一些期待的。
下面这张图列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的。其中图的最后一行C#6.0是根据一些博客整理的,如有错误,随时改正。
C# 4.0的新特性
基本上已经用到这些内容, 以下补充一些有记录价值的概念;
1.Dynamic
动态语言运行时
动态语言运行时(Dynamic Language Runtime,DLR)是动态查找的底层实现的一个重要组件,也是.NET 4.0中新增的API。
DLR不仅为C#动态查找,还为很多其他.NET上的动态语言——如IronPython和IronRuby——的实现提供了底层的基础设施。这一通用基础设施确保了高度的互操作性,更重要的是,DLR提供了卓越的缓存机制,使得运行时分派的效率得到巨大的改善。
对于使用C#动态查找的用户来说,除了更高的性能之外,根本感觉不到DLR的存在。不过,如果你希望实现自己的动态分派对象,可以使用IDynamicObject接口来与DLR互操作,并向其中插入自己的行为。这是一个非常高级的任务,要求对DLR的内部工作原理有相当深入的了解。对于编写API的人,值得在这些问题上花些功夫,这样能够更广泛地改善可用性,例如为一个本身就是动态的领域编写类库。
2.命名参数和可选参数
public void M(int x, int y = 5, int z = 7); //默认参数值;
M(1) 等同于 M(1,5,7)
M(x=1,z=9) 等同于M(1,5,9) //5是默认
关于重载:
public void M(int x);
M(1) 执行时, M(int x) 优于M(int x, int y = 5, int z = 7)
2.协变,逆变
T<in> ,T<Out>
Func<in Targs, out Tresult>(Targs args)
3.其他重要特性
http://www.cnblogs.com/yangqi/archive/2010/07/16/1778767.html
C# 5.0的新特性
第一:绑定运算符,:=:
comboBox1.Text :=: textBox1.Text; //将文本框的内容绑定到下拉框。
第二:带参数的泛型构造函数:
public class T MyClass : T: class, new()
//we might have
public class T MyClass : T:class, new(int)
第三:支持null类型运算:
int x? = null;
int y? = x + 40;
Myobject obj = null;
Myotherobj obj2 = obj.MyProperty ??? new Myotherobj();
第四:case表达式,支持表达式:
switch(myobj){
case string.IsNullorEmpty(myotherobj):
.....
case myotherobj.Trim().Lower:
....
}
第五:扩展属性。
[Associate(string)]public static int MyExtensionProperty { get;set;}
C# 6.0可能的新特性
1、主构造函数(Primary Constructors)
主构造函数给类中的变量赋值
Before
public class Point { private int x, y; public Point(int x, int y) this.x = x; this.y = y; } }
After
public class Point(int x, int y) { private int x, y; }
2、自动属性赋值(Auto Properties)
Before
class Point { public int X { get; private set; } public int Y { get; private set; } public Point() { this.X = 100; this.Y = 100; } }
After
class Point { public int X { get; private set; } = 100; public int Y { get; private set; } = 100; }
3、using静态类(Static type using statements;)
using会把引用类的所有静态方法导入到当前命名空间
Before
public double A { get { return Math.Sqrt(Math.Round(5.142)); } }
After
using System.Math; ... public double A { get { return Sqrt(Round(5.142)); } }
4、Property Expressions
Before
public double Distance { get { return Math.Sqrt((X * X) + (Y * Y)); } }
After
public double Distance => Math.Sqrt((X * X) + (Y * Y));
初看起来像Lambda表达式,其实和Lambda无关系。
5. Method Expressions
Before
public Point Move(int dx, int dy) { return new Point(X + dx1, Y + dy1); }
After
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
这个和Property Expressions类似
6、Params for enumerables
Before
Do(someEnum.ToArray()); ... public void Do(params int[] values) { ... }
After
Do(someEnum); public void Do(params IEnumerable<Point> points) { ... }
以前params是只可以修饰array类型的参数,现在多了一些类型
7、Monadic null checking(null检查运算符)
Before
if (points != null) { var next = points.FirstOrDefault(); if (next != null && next.X != null) return next.X; } return -1;
After
var bestValue = points?.FirstOrDefault()?.X ?? -1;
这个少了好几行代码,赞啊
8、Constructor type parameter inference
Before
var x = MyClass.Create(1, "X"); ... public MyClass<T1, T2> Create<T1, T2>(T1 a, T2 b) { return new MyClass<T1, T2>(a, b); }
After
var x = new MyClass(1, "X");
9、 Inline declarations for out params(内联out参数定义)
Before
int x; int.TryParse("123", out x);
After
int.TryParse("123", out int x);
说实话,这个很常用。
当然,C# 6.0的全部新特性不止这么多,限于篇幅,就整理这些,若想了解更多,请参考下面的链接。
参考资料:
http://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status&referringTitle=Documentation
http://en.wikipedia.org/wiki/.NET_Framework_version_history
http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
http://www.kunal-chowdhury.com/2012/07/evolution-of-c-10-50-what-are-new.html