从Mono 4.0观C# 6.0部分新特性

Struct的默认构造函数

struct Complex
{
    public Int32 Re { get; set; }
    public Int32 Im { get; set; }
    public Complex()
    {
        Re = 0;
        Im = 0;
    }
}

C# 6.0以前的结构体是不能重载默认构造函数的。现在可以了。

自动属性赋值

上面的代码还可以用类改写为

class Complex
{
    public Int32 Re { get; set; } = 0;
    public Int32 Im { get; set; } = 0;
}

连默认构造函数都不用写了,当然这个特性只适用于类。

方法表达式

class Complex
{
    public Int32 Re { get; set; } = 0;
    public Int32 Im { get; set; } = 0;
    public Double Modulus () => System.Math.Sqrt (Re * Re + Im * Im);
}

属性表达式

上面的要调用方法来解决求模有点艹艹哒,所以换个姿势:

class Complex
{
    public Double Re { get; set; } = 0;
    public Double Im { get; set; } = 0;
    public Double Modulus => System.Math.Sqrt (Re * Re + Im * Im);
}

以前得这样写:

class Complex
{
    public Double Re { get; set; } = 0;
    public Double Im { get; set; } = 0;
    public Double Modulus {get { return System.Math.Sqrt (Re * Re + Im * Im); } }
}

哎哟,真特么冗长。

访问静态库

获得F#引以为傲的System.Math只需要using一下

using static System.Math;

空引用检查

(之前写错了,感谢aadilah指出)

如果有一个方法需要分割字符串,按照以前的办法应该是:

public static String sp (String args)
{
    if (args == null)
        return null;
    return args.Split (',') [0];
}

需要在前面执行一下空引用检查,C# 6就可以简化一下:

public static String sp (String args)
{
    return args?.Split (',') [0];
}

小魔术

我们可以使用nameof来获取参数/变量的名称...
比如

public void SetRe (Double? value)
{
    Re = value ?? 0.0;
    Console.WriteLine (nameof (Re));
}

然后我们就能在终端/命令行内看到"Re"...

遗憾

网上盛传的许多让人咋舌的方便用法诸如:内联out参数定义、IEnumerable的参数列表,都没能实现,其实成员索引原本有一个$符号来简化访问,但是M$表示这个将不会针对C#实现。

成员索引(旧版本特性,简化访问被否决)

以类似成员的方式访问索引。

class SayHello{
    public string this[String index]
    {
        get { return "Hello " + index; }
    }
    public void haha(){
        var res = this["Microsoft"];
        Console.WriteLine(res);
    }
}

然后使用

SayHello sh = new SayHello ();
sh.haha ();

我们就能看到“Hello Microsoft”了...

暂时不知道这样写有什么好处...感觉没什么卵用...

最后

上面这些特性在Mono 4.0里面已经可以正常使用了,但是Xamarin Studio似乎被这些新特性弄迷糊了...现在智能感知处于瘫痪状态。
诸位可以通过M$的Roslyn来体验这些东西。当然,完整新特性建议参阅Build大会的内容。

posted @ 2015-05-19 00:18  Johnwii  阅读(...)  评论(... 编辑 收藏