总结一下C#6.0 7.0比较好的新的特性

1、C#6.0里的string.Format的改进,感觉这个真心很棒

Post post = new Post();
post.Title = "Title";
post.Content = "Content";

//通常情况下我们都这么写
string t1= string.Format("{0}_{1}", post.Title, post.Content);


//C#6里我们可以这么写,后台引入了$,而且支持智能提示。 
string  t2 = $"{post.Title}_{post.Content}";

2、C#6.0里面的空值判断

//老的语法,简单却繁琐。我就觉得很繁琐
Post post = null;
string title = "";
if (post != null)
{
      title = post.Title;
}


//C#6新特性一句代码搞定空判断
title = post?.Title;

空集合判断,这种场景我们在工作当中实在见的太多,从数据库中取出来的集合,空判断、空集合判断都会遇到。

Post post = null;
List<Post> posts = null;

 if (posts != null)
 {
      post = posts[0];
  }

//新特性,我们也是一句代码搞定。是不是很爽?
post = posts?[0];

3、元组

这是一个从方法中返回多个值的常见模式。目前可选用的选项并非是最佳的:

  • 输出参数:使用起来比较笨拙(即使有上述的改进),他们在使用异步方法是不起作用的。
  • System.Tuple<...> 返回类型:冗余使用和请求一个元组对象的分配。
  • 方法的定制传输类型:对于类型,具有大量的代码开销,其目的只是暂时将一些值组合起来。
  • 通过动态返回类型返回匿名类型:很高的性能开销,没有静态类型检查。

在这点要做到更好,C#7.0 增加的元组类型和元组文字:

(string, string, string) LookupName(long id) // tuple return type
{
    ... // retrieve first, middle and last from data storage
    return (first, middle, last); // tuple literal
}

这个方法可以有效地返回三个字符串,以元素的形式包含在一个元组值里。

这种方法的调用将会收到一个元组,并且可以单独地访问其中的元素:

var names = LookupName(id);
WriteLine($"found {names.Item1} {names.Item3}.");

Item1 等是元组元素的默认名称,也可以被一直使用。但他们不具有描述性,所以你可以选择添加更好的:

(string first, string middle, string last) LookupName(long id) // tuple elements have names

现在元组的接收者有多个具有描述性的名称可用:

var names = LookupName(id);
WriteLine($"found {names.first} {names.last}.");

你也可以直接在元组文字指定元素名称:

return (first: first, middle: middle, last: last); // named tuple elements in a literal

一般可以给元组类型分配一些彼此无关的名称:只要各个元素是可分配的,元组类型就可以自如地转换为其他的元组类型。也有一些限制,特别是对元组文字,即常见的和告警错误,如不慎交换元素名称的情况下,就会出现错误。

Note:这些限制尚未在 Preview 4 中实现。

元组是值类型的,它们的元素是公开的,可变的。他们有值相等,如果所有的元素都是成对相等的(并且具有相同的哈希值),那么这两个元组也是相等的(并且具有相同的哈希值)。

这使得在需要返回多个值的情况下,元组会非常有用。举例来说,如果你需要多个 key 值的字典,使用元组作为你的 key 值,一切会非常顺利。如果你需要在每个位置都具有多个值的列表,使用元组进行列表搜索,会工作的很好。

Note:元组依赖于一组基本类型,却不包括在 Preview 4 中。为了使该特性工作,你可以通过 NuGet 获取它们:

  • 右键单击 Solution Explorer 中的项目,然后选择“管理的NuGet包......”
  • 选择“Browse”选项卡,选中“Include prerelease”,选择“nuget.org”作为“Package source”
  • 搜索“System.ValueTuple”并安装它。
  • 解构
  • 消耗元组的另一种方法是将解构它们。一个解构声明是一个将元组(或其他值)分割成部分并单独分配到新变量的语法:

    (string first, string middle, string last) = LookupName(id1); // deconstructing declaration
    WriteLine($"found {first} {last}.");

    在解构声明中,您可以使用 var 来声明单独的变量:

    (var first, var middle, var last) = LookupName(id1); // var inside

    或者将一个单独的 var 作为一个缩写放入圆括号外面:

    var (first, middle, last) = LookupName(id1); // var outside

    你也可以使用解构任务来解构成现有的变量

    (first, middle, last) = LookupName(id2); // deconstructing assignment

    解构不只是应用于元组。任何的类型都可以被解构,只要它具有(实例或扩展)的解构方法:

    public void Deconstruct(out T1 x1, ..., out Tn xn) { ... }

    输出参数构成了解构结果中的值。

    (为什么它使用了参数,而不是返回一个元组?这是为了让你针对不同的值拥有多个重载)。

    复制代码
    class Point
    {
        public int X { get; }
        public int Y { get; }
     
        public Point(int x, int y) { X = x; Y = y; }
        public void Deconstruct(out int x, out int y) { x = X; y = Y; }
    }
    (var myX, var myY) = GetPoint(); // calls Deconstruct(out myX, out myY);
    复制代码

    这是一种常见的模式,以一种对称的方式包含了构建和解构。

    对于输出变量,我们计划在解构中加入通配符,来化简你不关心的变量:

    (var myX, *) = GetPoint(); // I only care about myX
posted @ 2017-04-18 10:37  小破天  阅读(141)  评论(0编辑  收藏  举报