在c#中使用Tuple类解决问题的真实世界和有效示例

本文关键字:真实世界 有效 解决问题 Tuple | 更新日期: 2023-09-27 18:08:08

我们一直在讨论Tuple及其各种可能的用途。在几乎所有情况下,它听起来像是邪恶的根源,它使设计变得更糟,并且通常需要一个专门的类而不是Tuple,它可以在任何地方使用。

它应该接近DB,但很难在DB持久逻辑代码中找到Tuple的用途。

有没有人在现实世界中使用元组的好例子,最好是接近一些现实世界的领域模型问题或任何实际使用。

在c#中使用Tuple类解决问题的真实世界和有效示例

Tuple据说被引入。net 4是因为一些编程语言(比如说,IronPython或f#)支持元组作为语言的核心特性,而。net BCL团队希望为这些语言提供统一的元组类型(我猜是出于语言互操作性的原因):

BCL团队决定与f#团队合作,为框架标准化一种元组类型,以便每种语言都能从中受益。(在Eric Lippert对SO问题的回答中,设计元组是为了解决什么问题?))

Tuple 在c#语言中没有多大意义,因为c#不太支持元组和一些相关的语言结构;例如元组"爆炸":将元组扩展到函数的参数上,或者将函数的返回值(以Tuple的形式)扩展到几个局部变量上:

Tuple<int,int>  GetFoo() { … }
//     v   v
int   (a,  b) = GetFoo();  // C# doesn't support this tuple-related syntax.

也就是说,如果你只写c#代码,你通常可以找到"更好",比使用Tuple更结构化的解决方案。例如,使用元组从一个方法返回多个值(如上面的GetFoo)是快速和方便的,但是返回值没有任何固有的结构—如果您愿意花一些额外的时间来定义structclass类型,您可能会做得更好。

在许多语言中,返回多个值是合法的(例如使用return (a, b)而不是使用refout(这些被认为是所有罪恶的另一个根源)。Tuple解决了这个问题。

让我们看看int Math.DivRem(int, int, out int)。它可以在Tuple<int, int> Math.DivRem(int, int)中重构。如果你认为在这种情况下,你应该使用特殊的类而不是Tuple,那么,对于委托,方向是相反的:在创建了一百个(实际上是几十个)专门的委托之后,MS创建了通用的ActionFunc,并开始使用它们。

(我们将忽略Tuple是一个类族,因此使用它们是"缓慢的"。不成熟的优化和所有那些美好的东西:-))

我将添加Tuple解决了在SO上编写短代码块的问题:-)

这个问题很开放,但我还是试了试。

  1. 元组在局部上下文中(方法内部)可以很好地缩短算法,就像匿名函数一样。
  2. 如果你使用好的类型(有意义的名字)Tuple<Result, Message>是非常可读的只有Item1, Item2的东西不是那么好
  3. 这来自函数式编程(就像Func<_,_>Action<_>一样),有时可以很好地使用-元组在很大程度上使用-看看f#,元组是提供多个函数参数的方式,而不是制作

函数返回返回值

的函数

例如:)

不要在你的大图(你可以称之为你的设计)中使用它们,但是对于你的局部实现它们是很好的

通常不使用它们作为公共接口的一部分,这不是它们的本意(至少在c#中)。当你懒得写自己的类来解决一个小问题时,它们就会派上用场了。

我发现它们在字典中特别方便。如果您有一个使用由两个或多个属性组成的键的私有字典,为了使其工作,您需要确保使用按值比较语义并正确实现哈希码(或提供自定义Comparer)。Tuple已经为您做了。