【发布时间】:2016-12-12 21:25:10
【问题描述】:
我刚刚观看了介绍new features of C# 7 的视频。其中,它引入了返回元组类型的可能性(例如:(int, int),我相信这只是Tuple<int, int> 的语法糖)。因此,如果我们有一个返回多个值的方法,那么 C# 中有 3 种可能性:
(int first, int second) ReturnTuple()
{
return (1, 2);
}
int ReturnOutParam(out int second)
{
second = 2;
return 1;
}
CustomObject ReturnObject()
{
return new CustomObject
{
First = 1,
Second = 2
};
}
我相信,没有其他方法可以做到这一点 - 如果是,请纠正我。
这三种方法中哪一种是正确的?在哪些情况下我们可以使用剩下的两个?对于每一个新的 C# 版本,我都有一种感觉,在 .NET 世界中,有一两种设计模式已经过时了。一些特性非常有用(如泛型、部分、LINQ、lambdas、async/await 或 null 传播器)。其他的则非常情境化(动态,nameof)。还有一些对我来说没有意义的东西(属性自动初始化器、元组返回值或本地函数)。
【问题讨论】:
-
“这三种方法中哪一种是正确的?” 好吧,它们都有效,所以从这个意义上说,它们都是“正确的”。哪一个实际上适合特定场景将取决于场景。话虽如此,第二个似乎真的很尴尬。
-
您可以就正常参数提出同样的问题。为什么将方法声明为
f(int a, int b, int c)而不是f(Tuple<int, int, int> abc)或f(CustomClass abc)?如果这些值是按逻辑分组的(例如,如果更频繁地使用它们,您会考虑将它们创建一个类),然后使用元组。如果没有,请将它们分开。 -
您展示的第 3 种方法强制您定义一个只需要返回 2 个值的类(并且可能在程序中的其他任何地方都没有使用它)。输出参数....我一直不喜欢它们(无法告诉你为什么...)返回多个值的语言支持对我来说似乎是件好事。当然,如果你愿意,你可以用旧的方式做同样的事情