我们一直在讨论元组及其各种可能的用途。几乎在所有情况下,它听起来都像邪恶的根源,它使设计变得更糟,并且通常需要一个专门的类而不是可以在任何地方使用的元组。
它应该接近DB,但很难在db持久性逻辑代码中找到Tuple的用法。
有没有任何真实世界好的Tuple使用样本,最好更接近某些现实世界领域模型问题或任何使用实际。
答案 0 :(得分:4)
Tuple
已被引入.NET 4,因为一些编程语言(例如,IronPython或F#)支持元组作为该语言的核心功能,而.NET BCL团队需要为这些语言提供统一的元组类型(我认为语言互操作性的原因):
BCL团队决定与F#团队合作,为框架标准化一种元组类型,以便每种语言都能从中受益。(在Eric Lippert对SO问题的回答中,{{ 3}})
Tuple
在C#语言IMHO中没有多大意义,因为C#不支持元组和一些相关的语言结构;例如元组“爆炸”:在函数的参数上传播元组,或者取一个函数的返回值(以Tuple
的形式)并将其传播到几个局部变量上:
Tuple<int,int> GetFoo() { … }
// v v
int (a, b) = GetFoo(); // C# doesn't support this tuple-related syntax.
话虽这么说,如果你只编写C#代码,你通常可以找到比使用Tuple
更“结构化”的解决方案。例如,使用元组从方法返回多个值(例如在上面的GetFoo
中)是快速和方便的,但返回值没有任何固有的结构 - 你可能会更好地使用{{ 1}}或struct
类型,如果您愿意花些时间来定义它。
答案 1 :(得分:3)
有许多语言可以返回多个值(例如return (a, b)
而非使用ref
或out
(这些被认为是所有邪恶的另一个根源)。){{ 1}}解决了这个问题。
让我们看看Tuple
。它可以在int Math.DivRem(int, int, out int)
中重构。如果您认为在这种情况下而不是Tuple,您应该使用特殊类,那么对于代理来说,方向恰恰相反:在创建了100个(实际上是数十个)专门委托之后,MS创建了通用Tuple<int, int> Math.DivRem(int, int)
和{{1已经开始使用它们了。
(我们将忽略Tuple是一个类的系列,所以使用它们是“慢”。过早优化和所有美好的东西:-))
我将补充说Action
解决了在SO上编写短代码块的问题: - )
答案 2 :(得分:2)
问题是非常开放的,但我无论如何都会尝试。
Tuple<Result, Message>
只有Item1
,Item2
的内容不太可读,那么Func<_,_>
和Action<_>
)并且有时非常好 - 元组在很大程度上被使用 - 看看F#那里的元组是提供多个功能参数而不是制作返回返回值
的函数的函数
例如:)
只是不要在大图片中使用它们(你可以称之为你的设计)但是对于你的本地实现它们很棒
答案 3 :(得分:0)
您通常不会将它们作为公共接口的一部分公开,这不是它们的意思(至少在C#中)。当你懒得写自己的课时,它们只是派上用场,只是为了解决一个小问题。
我发现词典特别方便。如果你有一个使用由两个或多个属性组成的密钥的私有字典,为了使它能够工作,你需要确保使用按值比较的语义并正确实现哈希代码(或提供自定义{{1 }})。 Comparer
已为您执行此操作。