当前位置: 首页 > news >正文

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 = 轻量级的“小结构体”,让你的代码更简洁优雅。

引入地址

http://www.jsqmd.com/news/259634/

相关文章:

  • 聚焦不锈钢管板:国内生产技术成熟的厂家一览,变压器法兰/压力容器法兰/双相钢法兰/不锈钢法兰,不锈钢管板公司哪个好 - 品牌推荐师
  • 2026年市场评价好的锻件源头厂家哪家权威,法兰/双相钢法兰/非标法兰/船用法兰/变压器法兰,锻件供应商找哪家 - 品牌推荐师
  • .NET + Vue 3 全栈开发:基于 YOLO 的AI图像识别平台实践
  • 2026年行业内可靠的不锈钢法兰厂商排行,非标法兰/不锈钢法兰/不锈钢管板/锻件/法兰,不锈钢法兰品牌怎么选择 - 品牌推荐师
  • 基于Spark的传感器数据实时分析与预测
  • MySQL的一张表使用InnoDB引擎,创建时如果忘记给这张表添加主键,请问这边表有没有聚簇索引?如果有的话聚簇索引是什么样的?
  • 2026年RTO市场新动态:口碑供货商评测指南,旋风除尘器/沸石转轮/沸石转轮+CO/RTO,RTO制造商推荐榜 - 品牌推荐师
  • 卡尔曼滤波中的变量解释(未完待续)
  • 2026年国内诚信的沸石转轮+CO公司联系电话,沸石转轮/活性炭箱/沸石转轮+CO/除尘器,沸石转轮批发厂家排行榜单 - 品牌推荐师
  • Java服务入门级耗时/cpu/内存/io分析
  • SMS-Activate停止运行
  • 详细介绍:技术演进中的开发沉思-219 Ajax:样式与事件
  • 【计算机毕业设计案例】基于python-CNN卷积神经网络深度学习训练识别不同颜色的裤子识别
  • 提示工程架构师:为社会变革注入新动能
  • 【课程设计/毕业设计】基于深度学习python-CNN-pytorch训练识别苹果树叶病害识别
  • 聚焦用户体验:近期备受推荐的RTO供货商深度解析,旋风除尘器/RTO/滤筒除尘器/除尘器/沸石转轮,RTO厂家怎么选 - 品牌推荐师
  • 全网最全专科生必用TOP10 AI论文工具测评
  • 20250117 之所思 - 人生如梦
  • Bug记录:neo4j-java-driver,Cannot coerce FLOAT to Java String
  • 深度学习毕设项目:基于python-CNN机器学习卷积神经网络训练识别不同颜色的裤子识别
  • 英语_听说_连读
  • 《数字图像处理》第 4 章 - 频域滤波
  • 深度学习毕设项目:基于python-CNN-pytorch人工智能训练识别苹果树叶病害识别
  • 2026年国内做得好的锻件实地厂家哪家好,船用法兰/法兰/锻件/双相钢法兰/不锈钢管板/高温合金法兰,锻件品牌选哪家 - 品牌推荐师
  • 《数字图像处理》第 5 章- 图像复原与重建
  • 【毕业设计】基于python-CNN-pytorch深度学习训练识别苹果树叶病害识别
  • Agent Skills 操作指南:从入门到高级自定义
  • 驾驭AI巨兽:大模型微调超参数完全解读,从新手到调参高手
  • 实用指南:洛谷 P1395:会议 ← 树的重心 + 链式前向星
  • 《数字图像处理》第 1 章 绪论