1. 使用 out
或 ref
参数
out
和 ref
参数允许方法修改传入变量的值,并通过它们“返回”多个值。ref
需要变量事先初始化,而 out
不要求。
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
元组允许你将多个值组合成一个复合值返回。
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. 定义一个类或结构体
创建一个包含所需字段的类或结构体,并返回这个类型的实例。
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查询中常用,但也可以在其他地方创建匿名类型并返回。
public object GetAnonymousValues()
{
return new { Value1 = 10, Value2 = "Hello" };
}
// 使用示例
var anonymousResult = GetAnonymousValues();
int numAnonymous = ((dynamic)anonymousResult).Value1;
string textAnonymous = ((dynamic)anonymousResult).Value2;
5. 使用动态类型
虽然不推荐作为常规做法,但在某些情况下可以返回 dynamic
类型。
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
成为了返回多个值的便捷且推荐的方式。