C# 多返回值写法

先看代码:

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),分别对应二次函数的三个系数。

二、为什么要这样设计?(解决了传统写法的痛点)

  1. 语义清晰:返回值直接命名为 a、b、c,调用者一眼就知道每个值的含义;
  2. 语法简洁 :无需新建类型,也无需 out 参数,调用时可以直接解构赋值(比如 var (a, b, c) = CalculateCircleInfo(...));
  3. 性能高效:值元组是值类型(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 };
    }
相关推荐
程序员猫哥_4 小时前
HTML 生成网页工具推荐:从手写代码到 AI 自动生成网页的进化路径
前端·人工智能·html
龙飞054 小时前
Systemd -systemctl - journalctl 速查表:服务管理 + 日志排障
linux·运维·前端·chrome·systemctl·journalctl
*小海豚*5 小时前
在linux服务器上DNS正常,但是java应用调用第三方解析域名报错
java·linux·服务器
我爱加班、、5 小时前
Websocket能携带token过去后端吗
前端·后端·websocket
AAA阿giao5 小时前
从零拆解一个 React + TypeScript 的 TodoList:模块化、数据流与工程实践
前端·react.js·ui·typescript·前端框架
心疼你的一切5 小时前
Unity异步编程神器:Unitask库深度解析(功能+实战案例+API全指南)
深度学习·unity·c#·游戏引擎·unitask
杨超越luckly5 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
撩得Android一次心动5 小时前
Android LiveData 全面解析:使用Java构建响应式UI【源码篇】
android·java·android jetpack·livedata
组合缺一5 小时前
Solon AI (Java) v3.9 正式发布:全能 Skill 爆发,Agent 协作更专业!仍然支持 java8!
java·人工智能·ai·llm·agent·solon·mcp
MSTcheng.5 小时前
【C++】C++11新特性(二)
java·开发语言·c++·c++11