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


    解构元组

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

    static void Main(string[] args)
    {
       (var name, var age) = GetUser();
       Console.WriteLine($"name:{name}
    age:{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}
    email:{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}	email:{email1}");
          (var name2,var age2, var email2) = user;
          Console.WriteLine($"name:{name2}	age:{age2}	email:{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;
        }
    }

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

      

      哪怕参数类型不一致

      

      

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

      

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

      

  • 相关阅读:
    SMTP发邮件(直接可用)实例
    ADO.NET(二)
    ADO.NET(一)
    C# 反射(一)
    APサーバ
    DB2 相关操作
    ArrayList与LinkedList时间复杂度之对比
    java泛型问题 关于警告:XX is a raw type
    Java编程中提高性能的几点建议
    STRUTS2核心控制器:FilterDispatcher
  • 原文地址:https://www.cnblogs.com/yan7/p/9501638.html
Copyright © 2020-2023  润新知