C# 中 Tuple 与 ValueTuples 之间的区别

news2024/9/22 18:23:54

在 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.coloradmin.cn/o/2042047.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

养猫家庭必备好物?希喂、霍尼韦尔宠物空气净化器真实测评

随着宠物空气净化器的讨论度越来越高&#xff0c;我也被种草了这款产品。对养宠家庭来说&#xff0c;十分需要这样一款转专门针对宠物毛发清理的工具。准备入手前我在网上做了许多功课&#xff0c;经过一番筛选后&#xff0c;最后希喂、霍尼韦尔两个品牌成功晋级决赛。 在对比…

代理IP为什么不能使用免费代理IP地址?

在跨境业务中&#xff0c;营销人员、广告投手经常利用代理IP防止账号关联与封禁&#xff0c;并且在访问网站时可以隐匿真实 IP 地址&#xff0c;定位目标市场。代理服务器充当中间人掩盖真实的数字足迹&#xff0c;这不仅增强了隐私&#xff0c;也会跨境业务提效提供保障。但是…

基于STM32开发的智能语音助手系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 智能家居控制个人语音助理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人工智能技术的发展&#xff0c;智能语音助手已经逐渐进入了人们的日常生活。…

【轨物推荐】创新有规律,发明有方法

原创 赵敏 发明方法研究 2020年03月11日 10:38 各位业内朋友&#xff0c;大家好&#xff01; 今年的疫情&#xff0c;对所有的企业都会有冲击&#xff0c;给企业的业务开展带来很多困扰。详细很多企业都在出主意、想办法&#xff0c;设法把疫情造成的损失降到最低。即使在平时…

行业原型:智慧制造:注塑云管工厂

行业原型预览链接&#xff1a;&#xff08;请与班主任联系获取原型文档&#xff09; 文件类型&#xff1a;.rp 支持版本&#xff1a;Axrure RP 8 文档名称&#xff1a;智慧制造&#xff1a;注塑云管工厂 文件大小&#xff1a;1.80 MB 目录内容介绍 文档内容介绍 回复 “211…

均数(mean±SD)与RR/OR值可以合并进行Meta分析吗?

经常有小伙伴问&#xff1a;在做危险因素的Meta分析时&#xff0c;遇到一些文献比较的是病例组和对照组某一指标的均值差异&#xff0c;数据以meanSD形式呈现&#xff0c;而另一些文献则是以OR或RR (95%CI)的形式描述该指标与疾病的关联。这两种数据形式可以一起进行Meta分析吗…

每周心赏|用AI真的可以开挂式求职

马上就要到2024年的金九银十了&#xff0c;正是求职的好时机啊&#xff01; 万事开头难&#xff0c;找工作第一步自然是离不开制作简历了&#xff01; 都说简历是面试的敲门砖&#xff0c;所以大家都很重视。 你不是也曾游走在各大网站中搜寻模板、寻找“大能们”的简历来修…

海运如何实时了解货物的物流轨迹?有什么系统可以实现?

物流轨迹在散货集拼业务中扮演着至关重要的角色&#xff0c;它不仅让客户可以实时掌握货物动态&#xff0c;确保了货物的安全无虞与准时送达&#xff0c;还为企业提供了灵活调整运输策略的依据&#xff0c;有益于运输效率与可靠性的双重提升。同时&#xff0c;通过物流轨迹的即…

RC电路里,电容多久可以充满电

时间常数 τR*C&#xff0c;那么电容需要多久能充满电呢&#xff1f; 例如下图仿真&#xff0c;R1KΩ&#xff0c;C1uF&#xff0c;那么τR*C1ms。 2个时间常数2ms的时间&#xff0c;电容电压充到86% 3个时间常数3ms的时间&#xff0c;电容电压充到95% 通常定义95为充满电。…

前端实现视频流播放:封装一个可复用的HlsPlayer组件

简介 在前端开发中&#xff0c;播放视频流是一个常见的需求&#xff0c;尤其是在需要实时监控或直播的场景中。本文将分享如何封装一个基于hls.js库的Vue组件&#xff0c;以便在任何需要的地方快速引用和播放视频流。 环境准备 首先&#xff0c;确保你的项目中已经安装了Vue…

【整数规划】+【0—1规划】解决优化类问题(Matlab代码)

目录 文章目录 前言 一、整数规划 分类&#xff1a; 二、典例讲解 1.背包问题 2.指派问题 总结 前言 如果觉得本篇文章还不错的话&#xff0c;给作者点个赞鼓励一下吧&#x1f601;&#x1f601;&#x1f601; 在规划问题中&#xff0c;有些最优解可能是分数或小数&am…

SpringBoot教程(二十二) | SpringBoot实现分布式定时任务之elastic-job

SpringBoot教程&#xff08;二十二&#xff09; | SpringBoot实现分布式定时任务之elastic-job 简介前置条件&#xff1a;需要ZooKeeper配合1、引入相关依赖2、application.yml中配置注册中心和作业调度巨坑&#xff08;配置修改无效&#xff09;3、job实例4、ElasticJob-UI监控…

Ansible自动化运维中剧本角色(roles)来完成apache服务操作

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; Ansible…

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表&#xff0c;要求具备交互功能&#xff0c;以及进行自助分析的能力&#xff0c;…

什么是云原生?(二)

1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义&#xff0c;云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…

22款奔驰GLE350加装原厂香氛负离子系统,起到了提神醒脑功能的效果

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。对于负离子系统同样实现原装位安装…

DASCTF 2024暑期挑战赛 easyjob

DASCTF 2024暑期挑战赛 easyjob 下载附件没有什么特别的&#xff0c;不过很明显是xxl-job的应用&#xff0c;而且是1.9.2版本的 我们去搜索文章https://xz.aliyun.com/t/13899 猜测有两个可能 一个是打api&#xff0c;一个打executor未授权 首先打api的话可以参考https://…

案例分享—国外深色UI界面设计赏析

在国外&#xff0c;深色界面设计&#xff08;Dark Mode&#xff09;已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度&#xff0c;保护用户视力&#xff0c;还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到&#xff0c;深色主题不仅提升了应用的视觉层…

.NET+WPF 桌面快速启动工具 GeekDesk

目录 前言 项目介绍 安装使用 1、下载安装 2、启动界面 项目功能 1、快速搜索程序和文件 2、显示设置 3、自定义壁纸 4、毛玻璃效果 5、自定义菜单图标 6、定时提醒 总结 项目地址 最后 前言 大家在平时工作中&#xff0c;是不是经常为了找某个文件或者应用而在…

[Qt][Qt 事件][下]详细讲解

目录 1.定时器0.是什么&#xff1f;1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么&#xff1f;2.使用 1.定时器 0.是什么&#xff1f; 在进⾏窗⼝程序的处理过程中&#xff0c;经常要周期性的执⾏某些操作&…