news 2026/6/10 17:00:42

C# 的小惊喜:ValueTuple,让多返回值更优雅,性能更强

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# 的小惊喜:ValueTuple,让多返回值更优雅,性能更强

目录

ValueTuple(值元组) 入门

给元素起名字

返回多个值

解构赋值

Tuple vs ValueTuple

性能测试

应用场景

总结


在日常 C# 开发中,我们经常会遇到这样的需求:
👉 一个方法需要返回多个值。

在 C# 7.0 之前,常见的解决方案有两种:

  • • 使用out参数 —— 代码可读性差,方法签名不美观;

  • • 使用Tuple<T1,T2>元组—— 虽然能返回多个值,但字段名都是Item1, Item2...,不仅丑,而且是引用类型,性能不佳。

为了让代码更加简洁,C# 7.0 引入了ValueTuple。不仅能更优雅地返回多个值,还能起名字、支持解构,并且是值类型,性能也更好。


ValueTuple(值元组) 入门

最简单的方式就是用括号包起来:

var person = (1, "Alice", 23); Console.WriteLine(person.Item1); // 1 Console.WriteLine(person.Item2); // Alice Console.WriteLine(person.Item3); // 23

这里的person类型是(int, string, int),底层对应的是ValueTuple<int, string, int>


给元素起名字

相比老的TupleValueTuple最大的提升之一就是:可以给字段命名

var person = (Id: 1, Name: "Alice", Age: 23); Console.WriteLine(person.Id); // 1 Console.WriteLine(person.Name); // Alice Console.WriteLine(person.Age); // 23

这让代码的可读性大大提升。
(注意:运行时其实还是Item1, Item2...,编译器只是帮你映射了名字。)


返回多个值

这是ValueTuple的主战场。我们可以让方法同时返回多个值,并且支持解构:

static (int Sum, int Product) Calculate(int a, int b) { return (a + b, a * b); } var (sum, product) = Calculate(3, 4); Console.WriteLine(sum); // 7 Console.WriteLine(product); // 12

out参数优雅了点


解构赋值

还可以直接在赋值时拆开:

(int x, int y) = (10, 20); Console.WriteLine(x); // 10 Console.WriteLine(y); // 20

如果只需要其中一部分,可以用_忽略:

var person = (Id: 1, Name: "Alice", Age: 23); var (_, name, _) = person; Console.WriteLine(name); // Alice

Tuple vs ValueTuple

特性

Tuple (元组)

ValueTuple

引入版本

.NET Framework 4.0

C# 7.0

类型

引用类型(class)

值类型(struct)

字段名

Item1, Item2...

支持自定义名字

性能

需要堆分配,性能一般

值类型,性能更好

最大元素数

8(再多要嵌套)

8(再多也要嵌套)

简而言之:ValueTuple 更快、更简洁、更可读。


性能测试

Tuple vs ValueTuple 性能对比的小 Demo,来直观感受两者差距。

const int N = 10_000_000; var sw = new Stopwatch(); // 测试 Tuple sw.Start(); for (int i = 0; i < N; i++) { var t = new Tuple<int, int>(i, i + 1); } sw.Stop(); Console.WriteLine($"Tuple: {sw.ElapsedMilliseconds} ms"); // 测试 ValueTuple sw.Restart(); for (int i = 0; i < N; i++) { var vt = (i, i + 1); // ValueTuple } sw.Stop(); Console.WriteLine($"ValueTuple: {sw.ElapsedMilliseconds} ms");

输出:
Tuple: 109 ms
ValueTuple: 27 ms

为什么快?

  • Tuple= 引用类型(class),分配在堆上,每次循环都会触发对象创建。

  • ValueTuple= 值类型(struct),可以存放在栈上,内存分配和释放都更轻量。


应用场景

  • 方法返回多个值(比如计算结果、查询结果)

  • 临时组合数据(避免为小需求单独写一个class

  • LINQ 查询中快速返回多列

如,一个简单的字符串处理方法:

static (int Length, string Upper, string Lower) Process(string input) { return (input.Length, input.ToUpper(), input.ToLower()); } var (len, up, low) = Process("Hello"); Console.WriteLine($"{len}, {up}, {low}"); // 输出:5, HELLO, hello

是不是一下子就比out参数优雅多了?


总结

C# 7.0 的ValueTuple,为我们带来了一种全新的写法:

  • • 它是值类型,性能更好;

  • • 它支持命名字段,可读性强;

  • • 它支持解构,写法更优雅。

在日常开发中,如果你需要返回多个值,不妨你用用它。

一句话总结:ValueTuple = 轻量级的“小结构体”,让你的代码更简洁优雅。

引入地址

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 22:45:19

Maven 依赖作用域实战避坑指南

在 Maven 项目开发中&#xff0c;依赖作用域的配置直接影响项目的编译、测试和打包结果&#xff0c;稍有不慎就会引发 ClassNotFoundException、依赖包冗余等问题。结合日常开发场景&#xff0c;本文整理了常见的作用域使用误区和解决方案&#xff0c;帮你精准避坑。一、 高频误…

作者头像 李华
网站建设 2026/6/9 11:24:40

豆包Ai指令85

链接&#xff1a;https://pan.quark.cn/s/2e58220cd806一份专为字节跳动豆包AI设计的实用指令与提示词合集&#xff0c;收录85条经过验证的常用模板。涵盖写作、编程、分析、营销等多个场景&#xff0c;助您快速掌握与AI高效协作的技巧&#xff0c;解锁更多深度功能与创意玩法。…

作者头像 李华
网站建设 2026/6/6 13:35:11

从嵌入式转向 FPGA,他用 6 个月拿下 15K Offer|真实学员回访

这是学员 L 同学 在入职当天给我们发来的第一句话&#xff1a;“不是嵌入式不好&#xff0c;是我发现自己更适合 FPGA。”他并不是应届生&#xff0c;而是一名有 2 年嵌入式开发经验 的工程师。 从 STM32、RTOS&#xff0c;到驱动调试、板级联调&#xff0c;他都做过&#xff0…

作者头像 李华
网站建设 2026/6/7 16:19:28

是德N9917B手持式网络频谱分析仪N9917A

是德N9917B手持式网络频谱分析仪N9917AN9917B是是德科技 (Keysight)推出的多功能集成式手持射频 / 微波分析仪&#xff0c;频率覆盖30kHz-18GHz&#xff0c;集电缆与天线测试 (CAT)、矢量网络分析 (VNA)、频谱分析 (SA)三大核心功能于一体&#xff0c;同时支持实时频谱分析 (RT…

作者头像 李华