专栏首页博客园C#7.0中的解构功能---Deconstruct

C#7.0中的解构功能---Deconstruct

解构元组

  C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子

static void Main(string[] args)
{
   (var name, var age) = GetUser();
   Console.WriteLine($"name:{name}\nage:{age}");
}
public static (string name,int age) GetUser()
{
    return ("张三", 11);
}

  可以看到解构元组可以写出优雅的代码,并且可以使用类型推断,但在这里解构元组并不是重点,所以不过多关注,下面说一个有趣的功能

解构对象

  解构能力并不是只能解构元组,他还有一个更加有意思的功能,就是解构对象。是不是听起来挺有意思。

static void Main(string[] args)
{
    var user = new User
   {
        Name = "张三",
        Age = 11,
        Email = "zhangsan@126.com",
     Sex="男"

   };
   (var name, var email) = user;
    Console.WriteLine($"name:{name}\nemail:{email}");
}

   上面代码是不是很惊奇,反正我第一次看到时特别惊讶,也感觉特别有意思,那么这到底怎么实现的呢,其实只是在类中添加一个解构函数(Deconstruct)就可以,解构参数方法名称必须是Deconstruct,返回值必须是void,参数列表必须是out

public class User
{
     public string Name { get; set; }
     public string Email { get; set; }
     public int Age { get; set; }
  public string Sex { get; set; }
     //解构函数
     public void Deconstruct(out string name,out string email)
     {
          name = Name;
          email = Email;
     }
}

  是不是感觉特别简单,哈哈,

  解构函数还支持重载

class Program
{
    static void Main(string[] args)
    {
      var user = new User
      {
         Name = "张三",
         Age = 11,
         Email = "zhangsan@126.com",
      Sex="男"
      };
      (var name1, var email1) = user;
      Console.WriteLine($"name:{name1}\temail:{email1}");
      (var name2,var age2, var email2) = user;
      Console.WriteLine($"name:{name2}\tage:{age2}\temail:{email2}");
    }
}   
public class User
{
    public string Name { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
   public string Sex { get; set; }
    //解构函数
    public void Deconstruct(out string name,out string email)
    {
       name = Name;
       email = Email;
    }
    //结构函数重载
    public void Deconstruct(out string name,out int age,out string email)
    {
       name = Name;
       age = Age;
       email = Email;
    }
}

  但是解构不支持参数一致的重载

  哪怕参数类型不一致

  感觉像参数类型推断错误,但是,,

  所以解构函数并不参数数量相同的重载,哪怕参数类型不一致

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 讲一下Asp.net core MVC2.1 里面的 ApiControllerAttribute

    转自:https://www.cnblogs.com/sheldon-lou/p/9495377.html

    莫问今朝
  • Mongo C# Driver 聚合使用---深入浅出

    ​ 我们都知道Mongo中聚合是由$match,$project等聚合项组成,所以在C# Driver中具有两种类型:聚合管道(PipelineDefiniti...

    莫问今朝
  • 原生JS--Ajax

    Ajax基础: --ajax:无刷新数据读取,读取服务器上的信息 --HTTP请求方法:     --GET:用于获取数据,如浏览帖子     --POST:用...

    莫问今朝
  • JavaScript检测flash player的版本号

    meteoric
  • 微信小程序日期+时间选择器

    这种内置定义好的选择器都是从底部弹起。目前支持五种选择器,通过设置mode来区分。分别是普通选择器,多列选择器,时间选择器,日期选择器,省市区选择器,默认是普通...

    李才哥
  • Spring 源码分析:不得不重视的 Transaction 事务

    业务系统的数据,一般最后都会落入到数据库中,例如 MySQL、Oracle 等主流数据库,不可避免的,在数据更新时,有可能会遇到错误,这时需要将之前的数据更新操...

    纯洁的微笑
  • JavaScript优化细节(一)

    1、置空Closure(闭包)引起的Memory leak滞留的Object和domain 2、用fragment实现append大量元素 var f= doc...

    寒月十八
  • iOS中一些WebView与JS交互的JS语句

    NSString * HTMLSource =  @"document.body.innerHTML";

    freesan44
  • 在Ocelot中使用自定义的中间件(二)

    在上文中《在Ocelot中使用自定义的中间件(一)》,我介绍了如何在Ocelot中使用自定义的中间件来修改下游服务的response body。今天,我们再扩展...

    李明成
  • 扩展graphiclayer实现多城市天气情况的展示

    在上一节,实现了点击展示城市天气的效果,在本节,讲述通过扩展graphiclayer实现同时显示多个城市天气的展示。

    lzugis

扫码关注云+社区

领取腾讯云代金券