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

1. 使用 out 或 ref 参数

out 和 ref 参数允许方法修改传入变量的值,并通过它们"返回"多个值。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. 使用 Tuple 或 ValueTuple

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

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 成为了返回多个值的便捷且推荐的方式。

相关推荐
David猪大卫26 分钟前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
用户3721574261351 小时前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
fengci.2 小时前
CTF2MISC中等部分
开发语言·前端·学习
xys_6783 小时前
JavaEE通关手册:初识Java
java·开发语言
ShineWinsu4 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu5 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.6 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
公子小六6 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
瑞雪兆丰年兮6 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客6 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎