通过Roslyn体验C# 6.0的新语法

在前几天微软的Build大会上,微软释放出了其下一代的编译器的Roslyn的新的预览版本,借助其开放 C# 和 Visual Basic 编译器的 API,使得开发者可以借助编译器进行解析代码文件、动态为编程语言增加功能、扩展编译器、自定义编译器动作等操作。

在其End User Preview的示例扩展中,借助其实现了几个之前微软在文章中Probable C# 6.0 features illustrated提到了一些可能会加入到C# 6.0中的新语法。(官方并未确定,不过应该八九不离十了),这里就简单的演示一下。

 

主构造函数(Primary Constructors)

我们通常通过构造函数给属性赋初值,一个常见的例子如下:

    class Point
    {
        public int X { get; set; }
        public int Y { get; set; }

        public Point(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
    }

现在, 通过过给类定义一个主构造函数,我们可以简化代码如下:

    class Point(int x, int y)
    {
        public int X { get; set; } = x;
        public int Y { get; set; } = y;
    }

或者给只读属性附初值

    class Point(int x, int y)
    {
        public int X { get; } = x;
        public int Y { get; } = y;
    }

其实这儿不限于属性,字段也可以也这种方式初始化。

 

自动属性初始化器

这个则是VB中已经有的一个语法,在当前的C#语法中,要给一个属性赋自动初值,一般有两种方式:

1. 在构造函数中:

    class Point
    {
        public int X { get; private set; }
        public int Y { get; private set; }

        public Point()
        {
            this.X = 100;
            this.Y = 100;
        }
    }

2. 使用属性封装

    class Point
    {
        int x = 100;
        public int X
        {
            get { return x; }
            private set { x = value; }
        }

        int y = 100;
        public int Y
        {
            get { return y; }
            private set { y = value; }
        }
    }

使用自动属性初始化时,代码则可简化如下:

    class Point
    {
        public int X { get; private set; } = 100;
        public int Y { get; private set; } = 100;
    }

 

using静态类(Static type using statements)

这个也是一个VB的特性了,在加上using 静态类的声明后,我们就可以不通过类名直接调用函数了,例如,如下代码:

    Math.Sqrt(Math.Round(5.142));

可以简化如下:

    using System.Math;
    Sqrt(Round(5.142));

如果在大量使用数学运算的时候看起来要舒服得多了。

 

内联out参数定义(Inline declarations for out params)

这个是我非常喜欢的一个特性。以前有out参数的地方的时候,必须先声明一个临时变量,如下所示:

    int x;
    int.TryParse("123", out x);

现在我们则可以把它写成如下形式了:

    int.TryParse("123", out var x);

就算需要out参数的返回值也可以一行代码搞定:

    var result = int.TryParse("123", out var x) ? x : 0;

 

成员索引(Indexed members)

这个语法之前倒是没有看到介绍,主要实现的是以类似成员的方式访问索引,示例如下:

    class MyClass
    {
        public string this[string index]
        {
            get { return "hello " + index; }
        }

        public void foo()
        {
            var result = this.$world;
            Console.WriteLine(result);        //
这里输出
hello world
        }
    }

不过这里我倒没有看出来有多大便利。

 

其它的一些语法里没有得到支持,毕竟这个只是一个通过预览版的插件扩展。 CSDN里有篇文章C# 6.0新特性抢先看介绍了一些更多的特性。CodePlex上则有一份官方的明细Language feature implementation status,看来这次C# 6.0有比较大的变更。

 

你可能感兴趣的:(C#)