C#中的解构

2023-11-03

解构是将一个对象分割成若干部分并将其存储到新的变量中。在 C# 中,解构可以方便地一次性将一个对象的多个成员的值存储到多个变量中。

1解构元组

元组为方法返回多个值提供了便捷,无需创建额外的类型来承载返回的值。例如,下面这个方法使用元组返回两个值:

public static (string, string, int) GetPerson()
{
    var firstName = "Liam";
    var lastName = "Wang";
    var age = 18;
    return (firstName, lastName, age);
}

对于检索这个方法返回元组的各成员,如果不使用解构,我们可能需要这样写:

var person = GetPerson();

var firstName = person.Item1;
var lastName = person.Item2;
var age = person.Item3;

使用解构,则可以一次性将元组的各成员分别赋值给不同的变量,可以这样写:

(string firstName, string lastName, int age) = GetPerson();

// firstName = "Liam"
// lastName = "Wang"
// age = 18

也可以使用 var 自动推断各个变量的类型:

var (firstName, lastName, age) = GetPerson();

// firstName = "Liam"
// lastName = "Wang"
// age = 18

元组的解构是基于成员的位置顺序来的,即将 Item1 赋给第一上变量,将 Item2 赋给第二个变量……。

但是,一旦你使用解构检索元组,你就必须处理它的各个成员。我们可以使用 弃元_)来处理我们不关心的成员,只获取元组中的我们需要的部分成员。例如:

var (firstName, _, _) = GetPerson();

// firstName = "Liam"

2解构类

我们也可以对类进行解构,并像对元组那样访问特定的字段。但为了实现这个目的,我们需要给类添加一个 Deconstruct() 方法,例如:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }

    public void Deconstruct(out string firstName, out string lastName, out int age)
    {
        firstName = FirstName;
        lastName = LastName;
        age = Age;
    }
}

然后可以和元组对象一样使用解构:

var person = new Person { FirstName = "Liam", LastName = "Liam", Age = 18 };

var (firstName, lastName, age) = person;

或只关心部分成员:

...

var (firstName, _, _) = person;

Deconstruct() 方法允许重载,比如:

...

public void Deconstruct(out string firstName, out string lastName) =>
    (firstName, lastName) = (FirstName, LastName);

public void Deconstruct(out string firstName, out string lastName, out int age) =>
    (firstName, lastName, age) = (FirstName, LastName, Age);

它会根据解构时的声明的变量数调用对应的 Deconstruct() 方法。

...

var (firstName, lastName) = person;

var (firstName, lastName, age) = person;

也可以通过静态扩展方法的方式给类的实例添加 Deconstruct() 方法,比如:

public static class PersonExtensions
{
    public static void Deconstruct(this Person person,
      out string firstName, out string lastName, out int age)
    {
        firstName = person.FirstName;
        lastName = person.LastName;
        age = person.Age;
    }
}

3解构记录

C# 9 的记录(Record)类型和元组一样,可以根据成员顺序直接解构。例如:

record Person(string FirstName, string LastName, int age);

static void Main(string[] args)
{
    var person = new Person("Liam", "Wang", 18);

    var (firstName, lastName, age) = person;
}

// firstName = "Liam"
// lastName = "Wang"
// age = 18

记录类型既可以和类一样有具名成员,也可以和元组一样有基于成员顺序的可解构特性,不需要单独定义 Deconstruct() 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中的解构 的相关文章

随机推荐

  • msvcp140_1.dll丢失怎样修复?快速修复dll文件缺失

    msvcp140 1 dll丢失怎样修复 关于msvcp140 1 dll丢失 其实和其他dll文件的修复方法是一模一样的 你缺失了什么dll文件 那么你就在百度搜索这个dll文件 然后放到指定的文件夹就好了 解决起来还是非常的简单的 ms
  • Cocos Creator资源管理AssetManager细说一二

    关于AssetManager Asset Manager 是 Creator 在 v2 4 新推出的资源管理器 用于替代之前的 cc loader 新的 Asset Manager 资源管理模块具备加载资源 查找资源 销毁资源 缓存资源 A
  • VUE搭建项目,配置本地IP地址其他人可访问项目(整理)

    1 首先找到config文件夹目录下的 index js文件 Various Dev Server settings host localhost 将localhost进行替换成 0 0 0 0 host 0 0 0 0 can be ov
  • 如何使用USB接口对C51单片机下载固件

    使用USB转UART芯片对单片机下载固件时会遇到的问题 C51系列单片机在下载固件的时候需要断电重启 在使用RS232接口的时候不会遇到什么困难 因为RS232不需要进行识别 但是现在使用USB转UART的芯片时会遇到问题 因为USB设备在
  • CIFAR-10训练模型(ResNet18)

    1 搭建环境 环境在实验进行时已经搭建完毕 具体步骤就不过多赘述 参考 https blog csdn net weixin 39574469 article details 117454061 接下来只需导入所需的包即可 import n
  • python中列表数据汇总和平均值_如何从记录列表中计算平均值

    所以我正在做一个作业 当从一个数据列表中计算一个平均值 数据是从一个外部的 txt文件中读取的 时 我似乎遇到了麻烦 具体来说 我要做的是从下面的数据列表中读取数据记录 在1 2 2014 Frankton 42305 67 23 12 4
  • 高德地图API INVALID_USER_SCODE问题以及keystore问题

    转载地址 http m blog csdn net article details id 50448014 请尊重原创 今天这篇文章会给大家介绍三个问题 1 接入API时出现invalid user scode问题 首先进行第一个大问题 接
  • python连接数据库设置编码_python连接mysql数据库——编码问题

    编码问题 1 连接数据库语句 在利用pycharm连接本地的mysql数据库时 要考虑到的是将数据库语句填写完整 困扰了一下午的问题就是连接语句并没有加入编码设置 db pymysql connect host localhost user
  • 如何利用计算机打印较大的字,如何在一张A4纸上打印一个超大字?

    是不是很想打印超大字 要是硬件上去了 就什么话也不用说了 可惜的是 手中只有一个A4的打印机 怎么办 还是有办法的 用Microsoft Office 2003就可以 我由于学校工作的原因 打印机只能打A4的纸 有时又想打超大字 不得不用现
  • TensorFlow零基础入门,实现手写数字识别

    TensorFlow 是一个用于人工智能的开源神器 主要为深度学习算法提供了很多函数 以及独特的运算支持 废话不多说直接上干货 我的环境 python3 7 tensorflow 1 13 2 numpy 1 20 2 1 入门示例 imp
  • 算法分享三个方面学习方法(做题经验,代码编写经验,比赛经验)

    目录 0 前言 遇到OI不要慌 只要道路对了 就不怕遥远 1 做题经验谈 1 1 做题的目的 1 2 我对于算法比赛的题目的看法 1 2 1 类似题 1 2 2 套模型 1 3 在训练过程中如何做题 1 4 一些建议 提高算法能力 1 5
  • AJAX分页以及IFRAME载入

    AJAX获取数据并分页显示 ul class movList ul div div
  • leetcode-03. 数组中重复的数字刷题笔记(c++)

    写在前面 难度 简单 unordered map 或 sort排序 大数组方法异常溢出 数据量 小数据量 数组元素作为下标 大数据量 无需map映射 耗费空间 sort排序 前后元素是否等值 题目详情 找出数组中重复的数字 在一个长度为 n
  • 一条慢SQL引发的改造

    前言 闲鱼服务端在做数据库查询时 对每一条SQL都需要仔细优化 尽可能使延时更低 带给用户更好的体验 但是在生产中偶尔会有一些情况怎么优化都无法满足业务场景 本文通过对一条慢SQL的真实改造 介绍解决复杂查询的一种思路 以及如何使得一条平均
  • Seata 处理分布式事务

    文章目录 1 Seata 简介2 2 Seata的安装 2 1 修改配置文件 2 2 在nacos上创建配置文件 seataServer yaml 2 3 安装路径seata seata server 1 6 0 seata script
  • C# —— 面向对象编程练习

    C 面向对象编程练习 基础题 代码如下 class Program static void Main string args rectangle r new rectangle Console WriteLine 调用不含参构造函数初始化后
  • [ElasticSearch]painless脚本获取字段方式及性能比较

    一 3种常见方式 doc fieldname 常用于在搜索或排序等无状态操作时进行使用 params source fieldname 也是常用在搜索或排序中 但更多用在获取额外字段时灵活操作时使用 如不获取某个字段直接使用params s
  • 基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真

    目录 1 算法运行效果图预览 2 算法运行软件版本 3 部分核心程序 4 算法理论概述 5 算法完整程序工程 1 算法运行效果图预览 2 算法运行软件版本 matlab2022a 3 部分核心程序 Rr Cc size Image1 获取
  • 适配器模式(Adapter)

    适配器是一种结构型设计模式 它能使接口不兼容的对象能够相互合作 又称封装器模式 Wrapper 适配器模式通过封装对象将复杂的转换过程隐藏于幕后 被封装的对象甚至察觉不到适配器的存在 例如 你可以使用一个将所有数据转换为英制单位 如英尺和英
  • C#中的解构

    解构是将一个对象分割成若干部分并将其存储到新的变量中 在 C 中 解构可以方便地一次性将一个对象的多个成员的值存储到多个变量中 1解构元组 元组为方法返回多个值提供了便捷 无需创建额外的类型来承载返回的值 例如 下面这个方法使用元组返回两个