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);
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;
创建一个包含所需字段的类或结构体,并返回这个类型的实例。
- 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;
在LINQ查询中常用,但也可以在其他地方创建匿名类型并返回。
- public object GetAnonymousValues()
- {
- return new { Value1 = 10, Value2 = "Hello" };
- }
-
- // 使用示例
- var anonymousResult = GetAnonymousValues();
- int numAnonymous = ((dynamic)anonymousResult).Value1;
- string textAnonymous = ((dynamic)anonymousResult).Value2;
虽然不推荐作为常规做法,但在某些情况下可以返回 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
成为了返回多个值的便捷且推荐的方式。