C# 6.0新特性抢先看解决方法

C# 6.0新特性抢先看
本帖最后由 caozhy 于 2014-04-02 11:31:27 编辑
鉴于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)等等程序。
------解决方案--------------------
除了元数据,其它的都只能算是小打小闹。
------解决方案--------------------
虽然是好 但是对我来说 没什么大用..
------解决方案--------------------
我只关心C#编译器什么时候能直接编译为本地代码
------解决方案--------------------
.net开发语言的功能已经够强了,应该有些产品,例如针对大数据或者云计算的框架
------解决方案--------------------
c#6.0的到来会不会同时有这个帖说的JIT编译器?http://bbs.csdn.net/topics/390606449
------解决方案--------------------
这些语法糖对于我这种只做算法那的人来说完全没用
------解决方案--------------------
东西不多, 但依然非常精彩 !
------解决方案--------------------
赞一个 C# 6.0新特性抢先看解决方法
------解决方案--------------------
引用:
我只关心C#编译器什么时候能直接编译为本地代码

同关心
------解决方案--------------------
引用:
Quote: 引用:

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