news 2026/9/2 21:02:40

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/9/2 6:19:07

Android调试命令宝典:从入门到精通的全场景实战指南

在Android开发、测试和逆向分析中&#xff0c;调试命令是开发者最有力的“瑞士军刀”。本文将带你深入探索Android调试命令的完整体系&#xff0c;涵盖从基础连接到高级分析的全场景实用技巧。 一、ADB核心命令体系 ADB&#xff08;Android Debug Bridge&#xff09;是连接开…

作者头像 李华
网站建设 2026/9/2 22:33:03

jadx-gui(java反编译工具)

链接&#xff1a;https://pan.quark.cn/s/fafb515cc32c jadx-gui是一款用过都说好的java 和安卓APK反编译工具,它功能强大,它可以处理大部分反编译的需求,满足相关人员日常反编译需求&#xff0c;反编译后的效果比jd-gui好。 一个简单轻巧的 DEX 到Java反编译器&#xff0c;可…

作者头像 李华
网站建设 2026/9/2 22:33:35

吐血推荐10个AI论文软件,研究生轻松搞定毕业论文!

吐血推荐10个AI论文软件&#xff0c;研究生轻松搞定毕业论文&#xff01; 论文写作的“救星”来了&#xff0c;AI 工具如何改变研究生的学术之路 在当今信息爆炸的时代&#xff0c;研究生们面对毕业论文的压力日益增大。从选题、开题到撰写、查重&#xff0c;每一个环节都充满…

作者头像 李华
网站建设 2026/8/29 8:25:16

Type-C接口3.7V锂电池充电模块原理图设计,已量产

目录 1、核心芯片:TP4056X 线性充电 IC 2、电路模块深度解析 2.1、Type-C 输入接口电路 2.2、充电电流切换电路 2.3、智能 LED 指示电路 在便携设备与低功耗 IoT 应用爆发的今天,单节 3.7V 锂电池的充电方案早已成为硬件工程师的 “日常课题”。今天我们拆解的这款充电板…

作者头像 李华
网站建设 2026/9/2 22:54:26

【安卓投屏】Escrcpy体验:比ADB更便捷的图形化手机投屏控制工具

对于开发者和技术爱好者来说&#xff0c;Scrcpy因其高性能和低延迟特性成为安卓投屏的首选方案&#xff0c;但其命令行操作方式对新手不够友好。Escrcpy​ 作为Scrcpy的图形化外壳&#xff0c;在保留全部核心功能的同时&#xff0c;通过Electron技术提供了直观的可视化操作界面…

作者头像 李华