C# 7.0中解构功能详解

本文为大家分享了C# 7.0中的解构功能,供大家参考,具体内容如下

解构元组

  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)

相关推荐

  • ES6学习之变量的解构赋值

    变量的解构赋值 ES6中允许按照一定模式,从数组和对象中提取,对变量进行赋值. 数组的解构赋值 var [a,b,c] = [1,2,3]; a // 1; b // 2; c // 3; 上面的代码标示可以从数组中提取值,按照位置的对应关系对变量进行赋值. 本质上,这种写法属于"模式匹配",只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [foo,[[bar],baz]] = [1,[[2],3]]; foo //1; bar //2; baz //3; let [,

  • 深入浅出讲解ES6的解构

    什么是解构? 解构与构造数据截然相反. 例如,它不是构造一个新的对象或数组,而是逐个拆分现有的对象或数组,来提取你所需要的数据. ES6使用了一种新模式来匹配你想要提取的数值, 解构赋值就是采用了这种模式. 该模式会映射出你正在解构的数据结构,只有那些与该模式相匹配的数据,才会被提取出来. 被解构的数据项位于赋值运算符 = 的右侧,可以是任何数组和对象的组合,允许随意嵌套.用于给这些数据赋值的变量个数不限. 数组解构 数组解构 使用一个数组作为一个数据项,你可以根据 数组模式 (用于从数组中匹配

  • C# 7.0中解构功能详解

    本文为大家分享了C# 7.0中的解构功能,供大家参考,具体内容如下 解构元组 C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[] args) { (var name, var age) = GetUser(); Console.WriteLine($"name:{name}\nage:{age}"); } public static (strin

  • C++头文件algorithm中的函数功能详解

    目录 1. 不修改内容的序列操作 (1)all_of (2)any_of (3)none_of (6)find_if (7)find_if_not (8)find_end (10)adjacent_find (12)count_if (15)is_permutation (16)search 2. 修改内容的序列操作 (1)copy (2)copy_n (3)copy_if (4)copy_backward (5)move (6)move_backward (7)swap (8)swap_ran

  • JavaScript解构赋值详解

    目录 概念 数组解构 声明分别赋值 解构默认值 交换变量值 解构函数返回的数组 忽略返回值(或跳过某一项) 赋值数组剩余值给一个变量 嵌套数组解构 字符串解构 对象解构 基础对象解构 赋值给新变量名 解构默认值 赋值给新对象名的同时提供默认值 同时使用数组和对象解构 不完全解构 赋值剩余值给一个对象 嵌套对象解构(可忽略解构) 注意事项 小心使用已声明变量进行解构 函数参数的解构赋值 解构的用途 交换变量的值 从函数返回多个值 提取JSON数据 总结 概念 ES6提供了更简洁的赋值模式,从数组和

  • JS基于对象的特性实现去除数组中重复项功能详解

    本文实例讲述了JS基于对象的特性实现去除数组中重复项功能.分享给大家供大家参考,具体如下: 数组去重的方法有很多,不同的方法的效率也不相同.如前面文章JS实现的数组去除重复数据算法小结中就总结分析了4种实现方法.这里介绍一种高效数组去重的方法:根据JS对象的特性去除数组中重复项的方法. 一.JS对象的特性(本文中所使用的特性):key始终唯一 引例:说明对象key值的唯一性,即当重新给js已有属性赋值的时候,实际上是覆盖了key,而不是新建了key var t={name:'张三',age:20

  • Android开发实现从相册中选择照片功能详解

    本文实例讲述了Android开发实现从相册中选择照片功能.分享给大家供大家参考,具体如下: 实际效果图: 代码实现: 1. 权限配置 2. 点击事件绑定 3. 相册访问 4. 根据路径设置图片 5. 其他方法 权限 首先,现在 mainfest.xml 文件中添加以下权限: <!--获取照片权限--> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <us

  • ES6数组与对象的解构赋值详解

    本文实例讲述了ES6数组与对象的解构赋值.分享给大家供大家参考,具体如下: 数组的解构赋值 基本用法 ES6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称之为解构(Destructuring) // 以前为变量赋值,只能直接指定值 var a = 1; var b = 2; var c = 3; // ES6允许写成这样 var [a,b,c] = [1,2,3]; 本质上,这种写法属于"模式匹配",只要等号两边的模式相同,左边的变量就会被赋予对应的值. 下面是一些使

  • ES6入门教程之变量的解构赋值详解

    前言 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值,下面话不多说了,来一起看看详细的介绍吧 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为结构. 在ES6之前想要为变量赋值,只能指定其值,如下: let a = 1; let b = 2 而在ES6中可以写成这样,如下: let [a,b] = [1,

  • Android7.0中关于ContentProvider组件详解

    作为Android的四大组件之一,ContentProvider作为进程之间静态数据传递的重要手段,其在系统级别的应用中起了重大的作用.毫无疑问,ContentProvider核心机制之一也是Binder,但是和其它3大组件又有区别.因为ContentProvider涉及数据的增删查改,当数据量比较大的时候,继续用Parcel做容器效率会比较低,因此它还使用了匿名共享内存的方式. 但是有一个问题是,ContentProvider的提供者进程不再存活时,其他进程通过Provider读一个非常简单的

  • django 中QuerySet特性功能详解

    Book表的数据显示 id title price publish_id 2 Linux 30 1 3 项塔兰 45 2 4 追风筝的人 39.9 3 5 富爸爸 23 10 创建queryset 视图 函数, 可以使用的列表的方法,按索引,切片的方法取值,得到一个列表对象 def queryset(request): ret1 = Book.objects.all()[0] #QuerySet支持索引,切片操作 # print(ret1) #linux 得到一个具体的对象 ret2 = Boo

  • Android6.0 屏幕固定功能详解

    可能大家看到这个标题不知道是什么东西,我先说明下,android6.0在设置->安全->屏幕固定开启后,然后再长按home键出现最近的几个Activity可以选择一个图钉按钮就开启了屏幕固定功能. 屏幕固定开启后,屏幕只能固定在设定的Task上的Activity切换. 一.设置固定屏幕 我们先来看SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java的代码,这段代码就是长按home键出现几个Activity,然后按

随机推荐