C# 中 Tuple 与 ValueTuples 之间的区别

在 C# 中,元组和值元组都用于在单个变量中存储多个值。但它们在语法、功能和性能方面存在一些关键差异。

一.Tuples(元组)

元组是一种引用类型,长期以来一直是 .NET 的一部分。它们是使用 System.Tuple 类创建的。

例子

using System;
class Program
{static void Main(){// 创建一个 Tuple 元组Tuple<int, string, bool> tupleExample = new Tuple<int, string, bool>(1, "Hello", true);// 访问 Tuple 元素Console.WriteLine($"Item1: {tupleExample.Item1}, Item2: {tupleExample.Item2}, Item3: {tupleExample.Item3}");}
}

二.ValueTuples(值元组)

ValueTuples 是最近添加的,是 C# 7.0 引入的值类型。与旧版 System.Tuple 相比,它们更轻量级,性能更好。ValueTuple 是使用 System.ValueTuple 结构创建的。

例子

class Program
{static void Main(){// 创建一个 ValueTuple(int, string, bool) valueTuple = (1, "Hello", true);// 访问 ValueTuple 的元素Console.WriteLine($"Item1: {valueTuple.Item1}, Item2: {valueTuple.Item2}, Item3: {valueTuple.Item3}");// 为 ValueTuple 的元素分配名称var namedValueTuple = (Id: 1, Message: "Hello", IsActive: true);Console.WriteLine($"Id: {namedValueTuple.Id}, Message: {namedValueTuple.Message}, IsActive: {namedValueTuple.IsActive}");}
}

三.主要区别

  1. Tuples(元组):引用类型(System.Tuple)。
  • ValueTuples(值元组):值类型(System.ValueTuple)。
  1. Tuples(元组):由于引用类型和堆分配而速度较慢。
  • ValueTuples(值元组):由于值类型和堆栈分配而速度更快。
  1. Tuples(元组):需要一个新的关键字。
  • ValueTuples(值元组):简洁,更易读,可以使用解构和命名元素。
  1. Tuples(元组):不可变值,创建后无法更改。
  • ValueTuples(值元组):可变值可以在创建后更改。

四.实际场景

在从 SQL Server 数据库检索数据的实际场景中,使用Tuple 和 ValueTuple。

1.执行以下 SQL Server 脚本

CREATE TABLE EmployeesDetails (Id INT PRIMARY KEY,Name NVARCHAR(100),IsActive BIT
);INSERT INTO EmployeesDetails (Id, Name, IsActive)
VALUES (1, 'Alice', 1);INSERT INTO EmployeesDetails (Id, Name, IsActive)
VALUES (2, 'Bob', 0);

2.查询

3.创建如下类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;namespace WpfApp2
{public class TupleExamples{static string connectionString = "Server=DESKTOP-JNM9BF1\\OMatrixtechSERVER;Database=Demo;User Id=sa;Password=1234;"; // 设置数据库连接字符串static string query = "SELECT Id, Name, IsActive FROM EmployeesDetails"; // 定义查询语句,用于从 EmployeesDetails 表中获取数据// 方法:从数据库中检索员工详情,并以 Tuple 的形式返回public static Tuple<int, string, bool> GetEmployeeTupleResult(){using (SqlConnection connection = new SqlConnection(connectionString)) // 使用连接字符串创建数据库连接{SqlCommand command = new SqlCommand(query, connection); // 创建 SqlCommand 对象,执行查询connection.Open(); // 打开数据库连接SqlDataReader reader = command.ExecuteReader(); // 执行查询并返回 SqlDataReader 对象if (reader.Read()) // 如果有数据返回{return new Tuple<int, string, bool>( // 创建一个 Tuple 对象并返回,包含三个字段的值reader.GetInt32(0), // 从结果中获取第一个字段(Id)reader.GetString(1), // 从结果中获取第二个字段(Name)reader.GetBoolean(2) // 从结果中获取第三个字段(IsActive));}}return null; // 如果没有数据返回,返回 null}// 方法:从数据库中检索员工详情,并以 ValueTuple 的形式返回public static (int Id, string Name, bool IsActive) GetEmployeeValueTupleResult(){using (SqlConnection connection = new SqlConnection(connectionString)) // 使用连接字符串创建数据库连接{SqlCommand command = new SqlCommand(query, connection); // 创建 SqlCommand 对象,执行查询connection.Open(); // 打开数据库连接SqlDataReader reader = command.ExecuteReader(); // 执行查询并返回 SqlDataReader 对象if (reader.Read()) // 如果有数据返回{return ( // 返回一个命名的 ValueTuple,包含三个字段的值reader.GetInt32(0), // 从结果中获取第一个字段(Id)reader.GetString(1), // 从结果中获取第二个字段(Name)reader.GetBoolean(2) // 从结果中获取第三个字段(IsActive));}}return (0, null, false); // 如果没有数据返回,返回一个默认的 ValueTuple}}
}// 示例:如何调用上述方法以检索并显示员工详情
private void ValueTuple_Click(object sender, RoutedEventArgs e) // 按钮点击事件处理程序
{Tuple<int, string, bool> tupleValue = TupleExamples.GetEmployeeTupleResult(); // 调用 GetEmployeeTupleResult 方法,并将结果存储在 tupleValue 变量中(int Id, string Name, bool IsActive) = TupleExamples.GetEmployeeValueTupleResult(); // 调用 GetEmployeeValueTupleResult 方法,并将 ValueTuple 的结果解构到相应的变量中
}

五.结论

ValueTuple 是大多数当代 C# 应用程序的首选,因为它具有性能优势和更简洁的语法。虽然传统 Tuple 仍然可以访问和使用,但除非需要与旧版 .NET 兼容,否则它通常不那么受欢迎。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/400999.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

07 STM32ADC

AD单通道和AD多通道 使用ADC可以对高电平和低电平之间的任意电压进行量化&#xff0c;最终用一个变量来表示&#xff0c;读取这个变量。所以ADC就是一个电压表&#xff0c;把引脚电压值测出来&#xff0c;放在一个变量里。 数字到模拟的桥梁&#xff0c;PWM来控制电机的速度&a…

springboot家校共育平台-计算机毕业设计源码54235

摘 要 采用高效的SpringBoot框架&#xff0c;家校共育平台为家长与教师提供了便捷的沟通渠道。该平台整合了丰富的教育资源&#xff0c;实现了家校之间的即时信息互通&#xff0c;从而助力协同教育。 为进一步方便用户访问和使用&#xff0c;平台与微信小程序进行了深度整合。家…

SPAW7000高精度功率分析记录仪,测试方案

测试目标 评估双电机四驱系统中前后电机的性能。 分析前后电机之间的实时联动情况。 测量并分析电机控制器的输入与输出功率。 计算功率转换效率和损耗。 验证电机系统的谐波特性。 测试设备 SPAW7000高精度功率分析记录仪&#xff1a;用于测量功率、电压、电流等参数&am…

【LeetCode Cookbook(C++ 描述)】一刷二叉树综合(上)

目录 LeetCode #226&#xff1a;Invert Binary Tree 翻转二叉树「遍历」「分而治之」广度优先搜索&#xff1a;层序遍历 LeetCode #101&#xff1a;Symmetric Tree 对称二叉树递归法迭代法 LeetCode #100&#xff1a;Same Tree 相同的树递归法迭代法 LeetCode #559&#xff1a;…

八种排序算法的复杂度(C语言)

归并排序(递归与非递归实现,C语言)-CSDN博客 快速排序(三种方法,非递归快排,C语言)-CSDN博客 堆排序(C语言)-CSDN博客 选择排序(C语言)以及选择排序优化-CSDN博客 冒泡排序(C语言)-CSDN博客 直接插入排序(C语言)-CSDN博客 希尔排序( 缩小增量排序 )(C语言)-CSDN博客 计数…

赋能基层,融合创新:EasyCVR视频汇聚平台构建平安城市视频共享系统

一、雪亮工程建设的意义 雪亮工程的核心在于通过高清视频监控、环境监测和智能预警等先进技术手段&#xff0c;构建一个高效、智能、安全、便捷的社会安全防控体系。这一工程的建设不仅代表了现代化科技手段在城市治安管理中的应用&#xff0c;更是提升社会安全保障能力、推动…

LeetCode.3152.特殊数组II

题目描述&#xff1a; 如果数组的每一对相邻元素都是两个奇偶性不同的数字&#xff0c;则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries&#xff0c;对于 queries[i] [fromi, toi]&#xff0c;请你帮助你检查 子数组 nums[fromi..toi…

纷享销客CRM AI产品架构概览、产品特色

一、纷享销客CRM AI产品架构概览 纷享AI平台架构分为三个主要层次&#xff1a;AI基础设施层、AI平台层和AI应用层。每个层次都由一系列功能模块组成&#xff0c;旨在为客户提供强大的技术支持和灵活的解决方案。 1.Al基础设施层 AI基础设施层是整个AI平台的底层支撑&#xff…

使用WooCommerce订阅续订进行货到付款:自定义订单状态

WooCommerce订阅插件允许商店设置周期性的订阅产品。客户购买订阅后&#xff0c;系统会自动根据设定周期进行续订。但对于货到付款的场景&#xff0c;自动续订就面临挑战。 自定义订单状态 为了实现货到付款的续订流程&#xff0c;我们需要创建一个自定义订单状态。以下是具体…

牛客刷题总结——Python入门07:内置函数

🤵‍♂️ 个人主页: @北极的三哈 个人主页 👨‍💻 作者简介:Python领域优质创作者。 📒 系列专栏:《牛客题库-Python篇》 🌐推荐《牛客网》——找工作神器|笔试题库|面试经验|实习经验内推,求职就业一站解决 👉 点击链接进行注册学习 文章目录 010 内置函…

鸿蒙开发入门day06-ArkUI简介

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;还请三连支持一波哇ヾ(&#xff20;^∇^&#xff20;)ノ&#xff09; 目录 ArkUI简介 基本概念 两种开发范式 不同应用类型支持的开发范式 …

Linux--应用层协议HTTP协议(http服务器构建)

目录 1.HTTP 协议 2.认识 URL 3.urlencode 和 urldecode&#xff08;编码&#xff09; urlencode&#xff08;URL编码&#xff09; urldecode&#xff08;URL解码&#xff09; 4.HTTP 协议请求与响应格式 4.1HTTP 常见方法&#xff08;三种&#xff09; 5.HTTP 的状态码…

如何妙用哈希表来优化遍历查找过程?刷题感悟总结,c++实现

先上题目 题目链接&#xff1a;题目链接 这题我最先想到的就是前缀和a&#xff0c;构造好了以后就遍历每一个[l,r]数组&#xff08;满足题目要求的连续区间数组&#xff09;&#xff0c;奈何倒数第二个样例时间超限 先给出原思路代码 class Solution { public:int subarray…

【深入理解SpringCloud微服务】Ribbon源码解析

【深入理解SpringCloud微服务】Ribbon源码解析 Ribbon的原理RestTemplate中的拦截器链Ribbon的拦截器如何将拦截器放入到RestTemplate中 Ribbon中的核心类LoadBalancerAutoConfigurationLoadBalancerInterceptorLoadBalancerClientILoadBalancerServerListIRuleIPing Ribbon核心…

【高性能高易用】物联网AI开发套件----Qualcomm® RB3 Gen 2 开发套件

Qualcomm RB3 Gen 2 开发套件 专为高性能计算、高易用性而设计的物联网开发套件 Qualcomm RB3 Gen 2 开发套件拥有先进的功能和强大的性能&#xff0c;包括强大的AI运算&#xff0c;12 TOPS 算力和计算机图形处理能力&#xff0c;可轻松创造涵盖机器人、企业、工业和自动化等…

【nginx 第一篇章】认识一下 NGINX 服务器

一、简介 Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务器&#xff0c;也是一个 IMAP/POP3/SMTP 代理服务器。由俄罗斯程序员 Igor Sysoev 开发&#xff0c;并在2004年首次公开发布。Nginx 以其高并发处理能力、低内存消耗、稳定性、丰富的功能集、简单的配置以及低学…

HarmonyOS应用三之组件生命周期和参数传递

目录&#xff1a; 1、生命周期的执行顺序2、页面数据传递3、图片的读取4、数据的备份和恢复5、轮播图6、页面布局图 1、生命周期的执行顺序 /** Copyright (c) 2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* yo…

html+css 实现hover 换背景跳动按钮

前言:哈喽,大家好,今天给大家分享html+css 实现hover 换背景跳动按钮!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦 💕 目录 📚一、效果📚二、原理解析💡这个按钮hover后,有4个变化:📝1.1…

⼆叉树选择题

⼆叉树选择题 本篇文章是初阶二叉树的收尾&#xff0c;旨在进一步加深对于二叉树性质的理解&#xff0c;祝你有一个愉快的学习之旅&#xff01; &#x1f4a1; ⼆叉树性质 1&#xff09;对任何⼀棵⼆叉树, 如果度为 0 其叶结点个数为 n0 , 度为 2 的分⽀结点个数为 n2 ,则有…

Java 阿里云视频直播开发流程

首先来看一下直播效果 推流工具有很多种&#xff08;例如OBS、阿里云直播Demo推流、等等&#xff0c;我用的是芯象导播&#xff09;阿里播放器地址 一、直播基础服务概述 官方文档说明 二、直播域名配置需要两个域名&#xff08;推流域名、播流域名&#xff09; 官方文档说…