有三种简单的方法可以做到这一点:
第一种方法:
//use a struct to wrap values:
struct returnPair { public int number; public int[] array; }
private returnPair MyFunction(int arg1) {
return new returnPair { number = ...., array = ...., };
}
优先使用 struct 而不是 class,因为它是按值传递的,因此避免了一些可变性问题,也避免了处理 null。更喜欢字段而不是属性,因为字段声明起来更短,并且在这个用例中没有缺点。
第二种方法:
通过Tuple.Create(....,....) 使用元组 - 这在其他答案中有解释。
第三种方法:
使用延续/回调。不要过度;但有时这是一个不错的选择;特别是当您想“返回”多个项目但不能轻松使用 yield return 策略时,例如在处理大量递归函数或不支持多次枚举时。它还具有允许非常可读的调用的优点 - 比 C# 中的元组更好。
private void MyFunction(int arg1, Action<int, int[]> yieldF) {
yieldF(....num, ....arr);
yieldF(....num2, ....arr2); //and again...
}
//call like this note that unlike a tuple params are labelled and readable,
//basically like a foreach loop with multiple loop variables:
MyFunction(3+4+5, (intp, arrp) => {
Do-My-Side-Effect
});
偷偷摸摸的方法:-)
如果你偷偷摸摸(不推荐),你甚至可以结合第一个和第三个选项并滥用类型推断来将命名参数包装在一个自动生成的只读类中:-)
private T MyFunction<T>(int arg1, Func<int, int[], T> yieldF) {
return yieldF(....num2, ....arr2); //and again...
}
//...
var anontuple = MyFunction(3+4+5, (intp, arrp) => new { IntP = intp, ArrP = arrp, });
int foobar = anontuple.IntP + anontuple.ArrP[0];//with intellisense...