从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  阅读(360)  评论(0编辑  收藏  举报