先看代码:
cs
// 核心方法:返回具名值元组(Circumference=周长, Area=面积, Diameter=直径)
public static (double Circumference, double Area, double Diameter) CalculateCircleInfo(double radius)
{
// 计算三个值
double circumference = 2 * Math.PI * radius;
double area = Math.PI * radius * radius;
double diameter = 2 * radius;
// 直接返回具名元组(名称和返回类型对应)
return (circumference, area, diameter);
}
这是 C# 里非常实用的值元组(Value Tuple) 特性,从 C# 7.0 开始引入,专门用来解决 "需要返回多个独立值" 的场景,完全符合 C# 的语法规范。
一、先明确:这种返回类型的本质是什么?
你看到的 (double a, double b, double c) 不是 "奇怪的写法",而是具名值元组的标准语法:
- 括号
()表示这是一个 "元组"(可以理解为 "一组值的集合"); double a表示元组里第一个元素是 double 类型,且给它命名为a;- 整体含义:这个函数返回一个包含 3 个 double 类型值的元组,且每个值有明确的名称(a、b、c),分别对应二次函数的三个系数。
二、为什么要这样设计?(解决了传统写法的痛点)
- 语义清晰:返回值直接命名为 a、b、c,调用者一眼就知道每个值的含义;
- 语法简洁 :无需新建类型,也无需 out 参数,调用时可以直接解构赋值(比如
var (a, b, c) = CalculateCircleInfo(...)); - 性能高效:值元组是值类型(struct),比新建类 / 结构体更轻量,无 GC 开销。
三、等价写法
方案 1:out 参数(最简洁)
cs
// 核心方法:通过out参数返回3个值
public static void CalculateCircleInfo(double radius,
out double circumference, // 周长
out double area, // 面积
out double diameter) // 直径
{
circumference = 2 * Math.PI * radius;
area = Math.PI * radius * radius;
diameter = 2 * radius;
}
方案 2:结构体(语义最清晰)
cs
// 1. 定义结构体封装3个值
public struct CircleInfo
{
public double Circumference { get; set; } // 周长
public double Area { get; set; } // 面积
public double Diameter { get; set; } // 直径
}
public static CircleInfo CalculateCircleInfo(double radius)
{
return new CircleInfo
{
Circumference = 2 * Math.PI * radius,
Area = Math.PI * radius * radius,
Diameter = 2 * radius
};
}
方案 3:旧版 Tuple(.NET 4.0+)
cs
// 方法返回旧版Tuple
public static Tuple<double, double, double> CalculateCircleInfo(double radius)
{
double c = 2 * Math.PI * radius;
double a = Math.PI * radius * radius;
double d = 2 * radius;
// 创建Tuple(Item1=周长, Item2=面积, Item3=直径)
return Tuple.Create(c, a, d);
}
方案 4:数组(最简陋)
cs
// 方法返回double数组
public static double[] CalculateCircleInfo(double radius)
{
double c = 2 * Math.PI * radius;
double a = Math.PI * radius * radius;
double d = 2 * radius;
// 数组索引:0=周长, 1=面积, 2=直径
return new double[] { c, a, d };
}