C# 6.0新特性抢先看

threenewbee 2014-04-02 10:59:39
加精
鉴于C# 6.0的新特性已经在网上曝光,在不违反NDA的情况下,把我知道的一些已经公开的新特性和大家分享,这些特性可能会在最终版本中有所不同,只是让大家抢个鲜。大家知道C# 4.0以后,微软很少对它有更新了,VS2013更是罕见地成为一个根本没有更新C#的VS发布版本。但是长时间的寂静之后是一次爆发!

首先要说的叫做自动属性初始化器。这个特性实际上VB.NET已经有了。比如我们写如下代码:
class User
{
public List<Role> Roles { get; set; }
}
这代码有什么缺点呢?那就是new一个User出来,Roles是null。可能你会用如下两个办法之一解决:
(1)不用自动属性
class User
{
private List<Role> roles = new List<Role>();
public List<Role> Roles { get { return roles; } set { roles = value; } }
}
(2)使用构造函数
class User
{
public List<Role> Roles { get; set; }
public User() { Roles = new List<Role>(); }
}
现在你可以这么写:
class User
{
public List<Role> Roles { get; set; } = new List<Role>();
}
是不是很简单?

你还可以用它来写只读属性,比如这个List,我们一般只需要添加删除元素的操作,而指向另一个List似乎没有必要,那么我们可以定义成只读的。
class User
{
public List<Role> Roles { get; } = new List<Role>();
}

然后是主构造函数,你可以给类定义一个主构造函数,这个构造函数的参数在类的声明中直接写,比如:
class Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
}
现在可以这么写了:
class Point(int x, int y)
{
public int X { get; set; } = x;
public int Y { get; set; } = y;
}
我们同时也用了之前说的自动属性初始化器
其实不一定是自动属性,字段也是可以的。

然后是继承构造函数
比如
class ColoredPoint : Point
{
public Color PointColor { get; set; }
public ColoredPoint(Color color, int x, int y) : base(x, y)
{
PointColor = color;
}
}
现在可以这么写:
class ColoredPoint(Color color, int x, int y) : Point(x, y)
{
public Color PointColor { get; set; } = color;
}

现在,我们可以用类似Lambda表达式的方式编写get属性,比如
class Rect
{
public int Height;
public int Width;
public int Area { get { return Height * Width; } }
}
现在可以这么写:
class Rect
{
public int Height;
public int Width;
public int Area => Height * Width;
}

还有using静态类,这个特性可以简化很多代码,比如:
using System;
...
Console.WriteLine(Math.Abs(-1.2d));
现在我们可以像using命名空间一样直接using静态类:
using System.Console;
using Math;
...
WriteLine(Abs(-1.2d));

其实有很多这样可以简化代码的语法糖,我不给代码了,只是大概说说,详细的请看这里
http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

方法扩展,像Lambda那样定义方法
不定个数参数现在支持IEnumerable,不仅仅是数组了
null检查运算符,简化了多个对象内嵌层级判断null的代码
构造函数参数可以作用于泛型类型自动推定
二进制初始化器,对于定义位掩码、二进制数据很有用
内联out参数定义,以前需要单独一行定义一个用于函数out参数的变量,现在不要了
类初始化器不但可以初始化属性,也可以初始化事件了
接口包装,可以在对象中定义一个实现了接口的类型来代替这个对象实现接口
改进的集合初始化器现在可以对下标赋值
...

如果你觉得C#的改进只是小打小闹那就错了,C# 6.0将会在动态类型、异步编程、函数式编程、DSL和元编程、并行等方面有很多重大的改进,因为保密的原因,我不多说了,在合适的时机大家就能看到。

另外透露两个重要的消息:

C# 6.0编译器使用C#实现,并且微软将开放源代码。

C#语言、编译器将和Roslyn项目统一,微软将深度开放编译器的二次开发接口。这样的接口有什么用?我们可以用它做很多事情,比如用词法、语法解析增强编译器,或者写脚本语言,我们可以很容易开发语法高亮、代码分析、重构、根据代码绘制UML等反向建模、代码转换(比如开发一个Java->C#或者C#->VB.NET)等等程序。
...全文
13468 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdxfdxg 2015-07-31
  • 打赏
  • 举报
回复
Linq的时候很多人都说是语法糖,现在呢,Linq的DSL般的表达能力,延迟查询低内存占用,低计算量,说是语法糖的都被打脸了。语言的发展就是越来越方便,没有什么语法糖不语法糖,有助于开发都是好的。汇编也不过是01序列的语法糖,面向对象无非也是靠编译器转换为指令,也是语法糖。什么是语法糖?完全就是一个笑话。你怎么不说SQL也是语法糖,不用程序代码去查数据库?
why123qaz 2015-04-28
  • 打赏
  • 举报
回复
留言,学习.
Ahoo 2015-02-07
  • 打赏
  • 举报
回复
Mr显 2014-10-09
  • 打赏
  • 举报
回复
public int X { get; set; } = x; 这语法看起来真是太奇怪了,简直就是WTF!!! 语法糖应该是让代码看起来更直观,而不是更晕!
bindao2010 2014-08-08
  • 打赏
  • 举报
回复
MS 这是要逆天的节奏啊
青水 2014-04-12
  • 打赏
  • 举报
回复
语法糖而已,没用
bdmh 2014-04-12
  • 打赏
  • 举报
回复
其实还是很喜欢按部就班的代码风格,看着清晰,容易理解,一个构造函数都搞得这么多花样,反而不便于理解,不知老曹是否有这种看法
EnForGrass 2014-04-12
  • 打赏
  • 举报
回复
目前用4.5,感觉很够用,写法也很满意
michaelbob518 2014-04-11
  • 打赏
  • 举报
回复
高大上的感觉。。。先来顶顶。。
笨笨的小菜 2014-04-11
  • 打赏
  • 举报
回复
引用 12 楼 CCDDzclxy 的回复:
[quote=引用 11 楼 vbtime 的回复:] [quote=引用 4 楼 bwangel 的回复:] 我只关心C#编译器什么时候能直接编译为本地代码
同关心[/quote] 有风声 ms要这样那样搞了??[/quote] 期待中,有预览版,不知道何时能出来
PaulyJiang 2014-04-11
  • 打赏
  • 举报
回复
实际意义没多少啊
jy251 2014-04-10
  • 打赏
  • 举报
回复
面目全非~~~~~ 感觉完全颠覆了,异步编程确实需要改改了,每次异步修改UI,最让我头疼,最少要 写一个扩展方法,最好是回复到2003一样,直接修改UI,C#自己去判断是否为异步调用
zg672313 2014-04-10
  • 打赏
  • 举报
回复
跟不上节奏了,现在用的还是2.0的东西,没有体验过6.0是什么味道
  • 打赏
  • 举报
回复
引用 50 楼 bwangel 的回复:
C#的语法糖已经够多的了,再加几个也甜不到哪里去。 C#总不成靠这些糖来和java叫板吧? 一个游戏,游戏规则应该是精炼的,而玩法却是无穷的。 MS不应该用这些语法糖来“丰富”C#
这个支持,这些语法糖本身造成了很大的c#版本断层。
JeremyLim 2014-04-09
  • 打赏
  • 举报
回复
真的好好呀!
叫我 Teacher 周 2014-04-08
  • 打赏
  • 举报
回复
5.0都没有,突然来个6.0??? 这消息可信性有多强
u010200878 2014-04-07
  • 打赏
  • 举报
回复
不知不覺已經6.0了...............
MikeCheers 2014-04-07
  • 打赏
  • 举报
回复
我觉得挺好 有糖吃 呵呵 而且人家也说了 有保密的部分 散出些糖 让大家先乐乐 吸引下眼球 现在批判还为时过早 等全部出来了再看 也许 糖只是冰山一角 惊喜还在后面 期待中。。。。。。
  • 打赏
  • 举报
回复
如果一个人注重高效率地“创造”一些东西,那么他就跟那些只想微软给一大堆10年前的代码用来抄袭的人,看上去搞研发的习惯是不一样的。
  • 打赏
  • 举报
回复
实际上,强调熟悉新的语法(中的有意义部分)有一个好处,我们可以不经意地发现一些“喜欢混”的人。
加载更多回复(63)

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧