自己做的网站视频播放不了,win10怎么删除2345网址导航,企业app商城开发网站建设,哈尔滨松北区建设局网站之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性#xff0c;现在随着Visual Studio 14 CTP3的发布#xff0c;又陆续可以体验一些新的特性了#xff0c;这里简单的介绍一下之前没有介绍的新语法。 属性表达式#xff08;Property Expressions#… 之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性现在随着Visual Studio 14 CTP3的发布又陆续可以体验一些新的特性了这里简单的介绍一下之前没有介绍的新语法。 属性表达式Property Expressions 我们常常会在类中写一些通过函数生成的只读属性 class Point { public int X { get; set; } public int Y { get; set; } public Point(int x, int y) { this.X x; this.Y y; } public double Distance { get { return Math.Sqrt((X * X) (Y * Y)); } } public Point Move(int dx, int dy) { return new Point(X dx, Y dy); } } 现在可以利用一个Lambda表达式简化这一过程 public double Distance Math.Sqrt((X * X) (Y * Y)); 函数表达式Method Expressions 函数表达式和属性表达式比较类似使得我们可以通过Lambda表达式简化成员函数。还是以上面的Point为例Move函数可以简化如下 public Point Move(int dx, int dy) new Point(X dx, Y dy); 最后再总结前文介绍的几个新特性来一起来简化Point类 class Point(int x, int y) { public int X { get; set; } x; public int Y { get; set; } y; public double Distance Math.Sqrt((X * X) (Y * Y)); public Point Move(int dx, int dy) new Point(X dx, Y dy); } NULL检查运算符Monadic null checking 这个是我非常喜欢的一个语法例如我们要获取一个Point序列的第一个点的X坐标第一感觉会这么写 int firstX points.First().X; 但是老鸟会告诉你这儿没有进行NULL检查正确的版本是这样的 int? firstX null; if (points ! null) { var first points.FirstOrDefault(); if (first ! null) firstX first.X; } 正确倒是正确了代码取变得难读多了。现在在C# 6.0中引入了一个 ?. 的运算符前面的代码可以改成如下形式 int? firstX points?.FirstOrDefault()?.X; 从这个例子中我们也可以看出它的基本用法如果对象为NULL则不进行后面的获取成员的运算直接返回NULL 需要注意的是由于?.运算符返回的可以是NULL当返回的成员类型是struct类型的时候?.和.运算符的返回值类型是不一样的。 Point p new Point(3, 2); Console.WriteLine(p.X.GetType() typeof(int)); //true Console.WriteLine(p?.X.GetType() typeof(int?)); //true 另外除了?.运算符外还有一个?[]运算符以使得我们可以写出如下表达式 int? first customers?[0].Orders.Count(); nameof表达式Nameof expressions 我们常常在反射或类似的技术中以字符串的形式使用属性的名称抛开拼写错误不谈当我们进行重构而修改属性名称的时候由于字符串类型的属性得不到编译器检查修改相应的字符串属性名称是一件非常令人头痛的事情现在有了nameof再也不用担心拼错属性名称了。 nameof运算符可以作用于变量、函数、类以及名字空间中用于返回返回其名称例如 static void Main(string[] args) { Console.WriteLine(nameof(Main)); //输出 Main } 当其参数是由.运算符拼接起来的时候只返回最后的名称例如 Console.WriteLine(nameof(ConsoleApplication1.Program)); //输出 Program 这个也可以理解因为ConsoleApplication1.Program和Program本身就是等价的。 需要注意的是由于C#允许函数重载因此是存在同名函数的例如 static void foo() { } static void foo(int x) { } 这样就存在如下两个问题 转到定义应该跳到那个函数 当对其中的某个函数重命名另一个函数维持原名称的时候 使用nameof的地方是否也需要变化 这两个问题只是体现在VisualStudio上并不是语法的歧义也不影响运行结果。在CodePlex中也有专门的文章讨论它目前的处理方式是 转到定义应该跳到那个函数 谁先定义转到谁 当对其中的某个函数重命名另一个函数维持原名称的时候 使用nameof的地方是否也需要变化 重命名函数不重命名nameof其它的类型如属性等重命名会一起变化 catch和finally语句块中支持await 在C# 5.0中引入了await运算符可以方便我们执行异步运算。当时其并不能在catch和finally中使用让人有点意犹未尽的感觉。在C# 6.0放开了这一限制使用更加方便了。 try { res await Resource.OpenAsync(…); } catch (ResourceException e) { await Resource.LogAsync(res, e); //现在支持了 } finally { if (res ! null) await res.CloseAsync(); //现在也支持了 } catch支持筛选条件了 catch支持筛选条件也是呼声比较高的特性之一现在终于可以省得重新再抛一次了 try { foo(); } catch (Exception e ) if (e.HResult 0x800000C) { //do something } 其它未支持的特性 我这里只是介绍目前可以使用的新特性我这里试出来的貌似可以补充的就这么多了。其它还有一些尚未推出的特性等下次有了更新的版本再做介绍。感兴趣的朋友可以看看官方的特性实现状态文档http://roslyn.codeplex.com/wikipage?titleLanguage%20Feature%20StatusreferringTitleHome。目前比较期待的新特性是String interpolation和模式匹配尤其是模式匹配希望能早日体验一下。 另外目前还没有发现什么BCL方面的更新介绍虽然BCL已经比较完善了但感觉这次更新粒度蛮大的估计至少会有一些基础库的补充的。 转载于:https://www.cnblogs.com/TianFang/p/3928172.html