学懂C#编程:让函数返回 多个返回值 的几种常用技术

1. 使用 outref 参数

outref 参数允许方法修改传入变量的值,并通过它们"返回"多个值。ref 需要变量事先初始化,而 out 不要求。

cs 复制代码
public void GetValues(out int val1, out string val2)
{
    val1 = 10;
    val2 = "Hello";
}

// 使用示例
int num;
string text;
GetValues(out num, out text);

2. 使用 TupleValueTuple

元组允许你将多个值组合成一个复合值返回。

cs 复制代码
public (int, string) GetValues()
{
    return (10, "Hello");
}

// 使用示例
var result = GetValues();
int num = result.Item1;
string text = result.Item2;

// 使用 ValueTuple 可以命名元素
public (int Number, string Text) GetValueTuple()
{
    return (10, "Hello");
}

var valueResult = GetValueTuple();
int number = valueResult.Number;
string textValue = valueResult.Text;

3. 定义一个类或结构体

创建一个包含所需字段的类或结构体,并返回这个类型的实例。

cs 复制代码
public class Result
{
    public int Value1 { get; set; }
    public string Value2 { get; set; }
}

public Result GetValues()
{
    return new Result { Value1 = 10, Value2 = "Hello" };
}

// 使用示例
var resultClass = GetValues();
int numClass = resultClass.Value1;
string textClass = resultClass.Value2;

4. 使用匿名类型

在LINQ查询中常用,但也可以在其他地方创建匿名类型并返回。

cs 复制代码
public object GetAnonymousValues()
{
    return new { Value1 = 10, Value2 = "Hello" };
}

// 使用示例
var anonymousResult = GetAnonymousValues();
int numAnonymous = ((dynamic)anonymousResult).Value1;
string textAnonymous = ((dynamic)anonymousResult).Value2;

5. 使用动态类型

虽然不推荐作为常规做法,但在某些情况下可以返回 dynamic 类型。

cs 复制代码
public dynamic GetDynamicValues()
{
    return new { Value1 = 10, Value2 = "Hello" };
}

    // 使用示例类似于匿名类型
    dynamic dynamicResult = GetDynamicValues();
    
   // 动态类型在使用时不需要预先知道具体结构,但存在运行时错误风险
    int value1 = dynamicResult.Value1;
    string value2 = dynamicResult.Value2;
    
    Console.WriteLine($"Value1: {value1}, Value2: {value2}");

选择哪种方法取决于具体需求,如代码的清晰度、性能考量以及是否需要强类型支持等因素。在C# 7及以后版本中,ValueTuple 成为了返回多个值的便捷且推荐的方式。

相关推荐
leiming61 分钟前
c++ find_if 算法
开发语言·c++·算法
zxy28472253014 分钟前
利用C#的BotSharp本地部署第一个大模型AI Agent示例(1)
人工智能·c#·对话·ai agent·botsharp
广州服务器托管18 分钟前
[2026.1.6]WINPE运维版20260106,带网络功能的PE维护系统
运维·开发语言·windows·计算机网络·个人开发·可信计算技术
a努力。26 分钟前
京东Java面试被问:双亲委派模型被破坏的场景和原理
java·开发语言·后端·python·面试·linq
冰暮流星27 分钟前
javascript赋值运算符
开发语言·javascript·ecmascript
谢娘蓝桥27 分钟前
adi sharc c/C++ 语言指令优化
开发语言·c++
刘975334 分钟前
【第25天】25c#今日小结
java·开发语言·c#
豆沙沙包?38 分钟前
2026年--Lc330-394. 字符串解码(栈)--java版
java·开发语言
2501_9418008841 分钟前
从微服务限流到系统稳定性的互联网工程语法实践与多语言探索
开发语言·python
清水白石0081 小时前
《深度剖析 Pandas GroupBy:底层实现机制与性能瓶颈全景解析》
开发语言·python·numpy