Code Bye

C# 6.0新特性抢先看

 

鉴于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)等等程序。

不知道啥时候能用上
1分
除了元数据,其它的都只能算是小打小闹。
1分
虽然是好 但是对我来说 没什么大用..
1分
我只关心C#编译器什么时候能直接编译为本地代码
1分
.net开发语言的功能已经够强了,应该有些产品,例如针对大数据或者云计算的框架
2分
c#6.0的到来会不会同时有这个帖说的JIT编译器?http://bbs.csdn.net/topics/390606449
2分
这些语法糖对于我这种只做算法那的人来说完全没用
2分
东西不多, 但依然非常精彩 !
引用 1 楼 qq34196940 的回复:

不知道啥时候能用上

误以为是我自己呢

1分
赞一个 
1分
引用 4 楼 bwangel 的回复:

我只关心C#编译器什么时候能直接编译为本地代码

同关心

1分
引用 11 楼 vbtime 的回复:
Quote: 引用 4 楼 bwangel 的回复:

我只关心C#编译器什么时候能直接编译为本地代码

同关心

有风声 ms要这样那样搞了??

还在玩.net 4.5
1分
引用 7 楼 laviewpbt 的回复:

这些语法糖对于我这种只做算法那的人来说完全没用

外行求教 只做算法 的工作特性

2分
本帖最后由 caozhy 于 2014-04-02 14:32:53 编辑

加的这些语法糖让C#的代码阅读难度越来越高,各种新潮的,老旧的代码方式共存会让人看得头疼。

———–

有些语法特性会增加可读性的,比如二进制初始化器:
int bits =  0b00000011; // 等价 int bits = 3;
int num = 12_345_678; // 等价 int num = 12345678;

比如前面说的using静态类

比如out参数:
对比
string s = …
int x;
if (!int.TryParse(s, out x)) x = -1;

string s = …
int x = int.TryParse(s, out int t) ? t : -1;

总的来说,新的语法减少了编写同样代码用的代码行数,越短的代码越容易理解。

1分
如果 一年 不跟进学习的话,估计看不懂 C#代码了
1分
有点看不懂C#代码了
1分
 新特性看起来很好吃的样子
2分
其实现在已经有点看不懂有些c#代码了
最近几天研究oomapper 看了下automapper的源码,真是头晕,大量的表达式树语法,
准备再抽个时间研究下Express下面的那些玩意.
本帖最后由 caozhy 于 2014-04-02 17:52:09 编辑

还有 楼主是参与了c#6.0开发么?怎么涉及到什么保密协议?

——–
MVP有协议的。

1分
支持  
1分
习惯了原本的东东
3分
本帖最后由 caozhy 于 2014-04-02 17:56:35 编辑
引用 16 楼 wddw1986 的回复:

加的这些语法糖让C#的代码阅读难度越来越高,各种新潮的,老旧的代码方式共存会让人看得头疼。

———–

有些语法特性会增加可读性的,比如二进制初始化器:
int bits =  0b00000011; // 等价 int bits = 3;
int num = 12_345_678; // 等价 int num = 12345678;

比如前面说的using静态类

比如out参数:
对比
string s = …
int x;
if (!int.TryParse(s, out x)) x = -1;

string s = …
int x = int.TryParse(s, out int t) ? t : -1;

总的来说,新的语法减少了编写同样代码用的代码行数,越短的代码越容易理解。

就拿主构造函数这个特性来说,除了增加查阅代码的理解混乱程度并不能带来真正的编写便捷。
再一个就是using静态类,我觉得using了之后更容易让人迷茫,看代码还要注意使用了那些using才知道究竟调用的是哪个方法,觉得非常非常累啊。
某些特性让C#的代码看起来很潮,可惜很潮和很美和很便捷之间并没有什么关系,这么搞下去以后写C#代码本身就快成一种炫技的手段了。

我个人的观点是,对于编程语言来说,加入新特性,语法糖一定要循序渐渐,因为一旦加了将来就去不掉了,慢慢的语法方式会变得越来越混乱,就像日文相对于中文的语法来说就是一个字,乱!

———–
当然了,在一些极端的情况下的确有你说的问题,但是看问题要从大多数情况去看。比如说扩展方法,其实很少有人指责它让代码阅读起来费劲,但是调用扩展方法,我们实际上就不关心那个静态类的类型。这一点和using静态类没有什么不同。
编程语言本身提供灵活性,而程序员应该遵循最佳实践。这也是大多数语言设计在设计者和使用者之间达成的默契,比如ruby的猴子补丁,比如lisp的宏,如果滥用,后果更不堪设想,但是似乎也很少有人对这些特性加以批评。

引用 22 楼 sj178220709 的回复:

还有 楼主是参与了c#6.0开发么?怎么涉及到什么保密协议?

好吧 原来是翻译 我2了.

1分
这些语法糖太坑了,看起来都费劲!
1分
越来越高大上了,渐觉自己落伍了好多,还停留在2.0和3.5的时代
1分
c#最优美的还是3和4版本,它的一些新特性确实给开发带来方便,再往后推出的语法糖未必要用。
1分
大爷的
还在用3.5呢。。。。4.0都没用过几次。。。4.5更不要说了。。。。

C#6.0这是准备5.0的节奏么??

偶尔用用c#的新手  路过
编出来的程序好使,才是真的
引用 楼主 caozhy 的回复:

有些语法特性会增加可读性的,比如二进制初始化器:
int bits =  0b00000011; // 等价 int bits = 3;
int num = 12_345_678; // 等价 int num = 12345678;

比如前面说的using静态类

比如out参数:
对比
string s = …
int x;
if (!int.TryParse(s, out x)) x = -1;

string s = …
int x = int.TryParse(s, out int t) ? t : -1;

总的来说,新的语法减少了编写同样代码用的代码行数,越短的代码越容易理解。

2-1 这种减法能减少多少编码?这些减法在整体代码中占有多大比例?这些减法编码的时间在整体开发中占有多大的比例?
其实就好像pythoner在炫耀一行能少敲几下键盘,在真正的软件开发中对于工作量来说基本没有意义。
有多少人需要为了这种没有意义的减法付出额外的学习代价,这些学习能为学习者带来什么?
真正有意义的特性要做的是普适性的除法,也就是重点要支持新的抽象方式,而不是这种稀疏的减法。

我只关心加载效率,和运行效率会不会提高。
全都去火星生活吧,地球已经不合适居住了。。。
这么细?
1分
c#不应该搞太多的花样在语法的写法上。这将会导致每一个程序员写出来的东西风格都不一致。不统一,是个麻烦事。
MS花精力在这些花样语法上,不如花精力整些实质性的东西出来,比如新颖的架构或的成熟产品。 — .net没前(钱)途的原因就在这里。

这么吊????

不过还是习惯了 老式的写法.

改进也太大了,够学习了
技术更新真快,怎么也跟不上了…
还在用2.0 摔….
6.0啊6.0
服务器环境现在已经够折腾人了
C#的语法糖已经够多的了,再加几个也甜不到哪里去。
C#总不成靠这些糖来和java叫板吧?

一个游戏,游戏规则应该是精炼的,而玩法却是无穷的。 MS不应该用这些语法糖来“丰富”C#

2分
引用 4 楼 bwangel 的回复:

我只关心C#编译器什么时候能直接编译为本地代码

Announcing .NET Native Preview
http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx

引用 51 楼 findcaiyzh 的回复:
Quote: 引用 4 楼 bwangel 的回复:

我只关心C#编译器什么时候能直接编译为本地代码

Announcing .NET Native Preview
http://blogs.msdn.com/b/dotnet/archive/2014/04/02/announcing-net-native-preview.aspx

好像只有windows store的程序才可以

1分
好爽的语法,越来越简洁了,谢谢分享。
1分
这些糖不吃的话,过两年就看不懂年轻人的代码了
1分
赞一个,http://visualstudio.uservoice.com/forums/121579-visual-studio
上面的基本都实现了。?.应该以后会用得很广泛。
引用 35 楼 sbwwkmyd 的回复:
Quote: 引用 楼主 caozhy 的回复:

有些语法特性会增加可读性的,比如二进制初始化器:
int bits =  0b00000011; // 等价 int bits = 3;
int num = 12_345_678; // 等价 int num = 12345678;

比如前面说的using静态类

比如out参数:
对比
string s = …
int x;
if (!int.TryParse(s, out x)) x = -1;

string s = …
int x = int.TryParse(s, out int t) ? t : -1;

总的来说,新的语法减少了编写同样代码用的代码行数,越短的代码越容易理解。

2-1 这种减法能减少多少编码?这些减法在整体代码中占有多大比例?这些减法编码的时间在整体开发中占有多大的比例?
其实就好像pythoner在炫耀一行能少敲几下键盘,在真正的软件开发中对于工作量来说基本没有意义。
有多少人需要为了这种没有意义的减法付出额外的学习代价,这些学习能为学习者带来什么?
真正有意义的特性要做的是普适性的除法,也就是重点要支持新的抽象方式,而不是这种稀疏的减法。

那是你没有尝试过大量的数据转换。
之前弄过一个将时间文本转DateTime的,string year,month,day,hour,minute,second,ms。然后再声明同样的一堆int,接着再每个int.TryParse。每转一次,还要判断是否转换成功。复制粘贴,修改变量名,痛苦得要死。
现在有新语法能简写一点了。

不过个人意见还是编写代码的时候尽可能兼容旧代码,除非到时候c#6已经是主流了(就像.net 4.0以下的几乎都很少了,linq都是随便用),那就可以放心用了。

引用 56 楼 h82258652 的回复:

那是你没有尝试过大量的数据转换。
之前弄过一个将时间文本转DateTime的,string year,month,day,hour,minute,second,ms。然后再声明同样的一堆int,接着再每个int.TryParse。每转一次,还要判断是否转换成功。复制粘贴,修改变量名,痛苦得要死。
现在有新语法能简写一点了。

不过个人意见还是编写代码的时候尽可能兼容旧代码,除非到时候c#6已经是主流了(就像.net 4.0以下的几乎都很少了,linq都是随便用),那就可以放心用了。

我确实没有那个福分,终于知道这些东西是为谁准备的了,谢谢。

我是北京猿人
原文发布于 4.1日,把F#的地址当作C#6的地址
1分
引用 54 楼 davinciyxw 的回复:

这些糖不吃的话,过两年就看不懂年轻人的代码了

实际编程者即使手下管理有一万程序员,不会看不懂年轻人的代码。

只有那些在一个小公司还自认为“我已经转为管理”的人才看不懂。

可以更新为这个版本么?
1分
这种语法糖,对于菜鸟来说还是“没时间学”。

高手没法用这个拉开差距。

引用 12 楼 CCDDzclxy 的回复:
Quote: 引用 11 楼 vbtime 的回复:
Quote: 引用 4 楼 bwangel 的回复:

我只关心C#编译器什么时候能直接编译为本地代码

同关心

有风声 ms要这样那样搞了??

http://bbs.csdn.net/topics/390751256?page=1#post-397112351

已经可能本地了。

嗯 确实很不错的特性  很实用  LZ可以散分了不咯
引用 41 楼 bgu 的回复:

c#不应该搞太多的花样在语法的写法上。这将会导致每一个程序员写出来的东西风格都不一致。不统一,是个麻烦事。
MS花精力在这些花样语法上,不如花精力整些实质性的东西出来,比如新颖的架构或的成熟产品。 — .net没前(钱)途的原因就在这里。

说的在理

C# 不能这样乱改啊,原来还能叫糖,现在这个样子看上去,是沙子,这到嘴里全败味了
其实我觉得像 public int X { get; set; } = ……; 这样的代码看起来真个别扭,还不如学学早期的vb.net的属性关键字的规范,写成
    public property int X = …….;
每次改进都有意义,这就是真理,一切都是动态的.
有空闲的话看看这个http://bbs.csdn.net/topics/390752401
实际上,强调熟悉新的语法(中的有意义部分)有一个好处,我们可以不经意地发现一些“喜欢混”的人。
如果一个人注重高效率地“创造”一些东西,那么他就跟那些只想微软给一大堆10年前的代码用来抄袭的人,看上去搞研发的习惯是不一样的。
楼主这么叼是怎么知道的。
我觉得挺好
有糖吃

呵呵

而且人家也说了  有保密的部分  散出些糖  让大家先乐乐 吸引下眼球
现在批判还为时过早
等全部出来了再看 也许 糖只是冰山一角 惊喜还在后面
期待中。。。。。。

不知不覺已經6.0了…………… 
5.0都没有,突然来个6.0???
这消息可信性有多强
真的好好呀!
引用 50 楼 bwangel 的回复:

C#的语法糖已经够多的了,再加几个也甜不到哪里去。
C#总不成靠这些糖来和java叫板吧?

一个游戏,游戏规则应该是精炼的,而玩法却是无穷的。 MS不应该用这些语法糖来“丰富”C#

这个支持,这些语法糖本身造成了很大的c#版本断层。

跟不上节奏了,现在用的还是2.0的东西,没有体验过6.0是什么味道
面目全非~~~~~
感觉完全颠覆了,异步编程确实需要改改了,每次异步修改UI,最让我头疼,最少要 写一个扩展方法,最好是回复到2003一样,直接修改UI,C#自己去判断是否为异步调用
高大上的感觉。。。先来顶顶。。
实际意义没多少啊
引用 12 楼 CCDDzclxy 的回复:
Quote: 引用 11 楼 vbtime 的回复:
Quote: 引用 4 楼 bwangel 的回复:

我只关心C#编译器什么时候能直接编译为本地代码

同关心

有风声 ms要这样那样搞了??

期待中,有预览版,不知道何时能出来

语法糖而已,没用
目前用4.5,感觉很够用,写法也很满意
1分
其实还是很喜欢按部就班的代码风格,看着清晰,容易理解,一个构造函数都搞得这么多花样,反而不便于理解,不知老曹是否有这种看法
MS  这是要逆天的节奏啊
public int X { get; set; } = x;

这语法看起来真是太奇怪了,简直就是WTF!

语法糖应该是让代码看起来更直观,而不是更晕!

留言,学习.

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# 6.0新特性抢先看