在c#中使用Tuple类解决问题的真实世界和有效示例
本文关键字:真实世界 有效 解决问题 Tuple | 更新日期: 2023-09-27 18:08:08
我们一直在讨论Tuple及其各种可能的用途。在几乎所有情况下,它听起来像是邪恶的根源,它使设计变得更糟,并且通常需要一个专门的类而不是Tuple,它可以在任何地方使用。
它应该接近DB,但很难在DB持久逻辑代码中找到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
)是快速和方便的,但是返回值没有任何固有的结构—如果您愿意花一些额外的时间来定义struct
或class
类型,您可能会做得更好。
在许多语言中,返回多个值是合法的(例如使用return (a, b)
而不是使用ref
或out
(这些被认为是所有罪恶的另一个根源)。Tuple
解决了这个问题。
让我们看看int Math.DivRem(int, int, out int)
。它可以在Tuple<int, int> Math.DivRem(int, int)
中重构。如果你认为在这种情况下,你应该使用特殊的类而不是Tuple,那么,对于委托,方向是相反的:在创建了一百个(实际上是几十个)专门的委托之后,MS创建了通用的Action
和Func
,并开始使用它们。
(我们将忽略Tuple是一个类族,因此使用它们是"缓慢的"。不成熟的优化和所有那些美好的东西:-))
我将添加Tuple
解决了在SO上编写短代码块的问题:-)
这个问题很开放,但我还是试了试。
- 元组在局部上下文中(方法内部)可以很好地缩短算法,就像匿名函数一样。
- 如果你使用好的类型(有意义的名字)
Tuple<Result, Message>
是非常可读的只有Item1
,Item2
的东西不是那么好 - 这来自函数式编程(就像
Func<_,_>
和Action<_>
一样),有时可以很好地使用-元组在很大程度上使用-看看f#,元组是提供多个函数参数的方式,而不是制作
函数返回返回值
的函数
例如:)
不要在你的大图(你可以称之为你的设计)中使用它们,但是对于你的局部实现它们是很好的
通常不使用它们作为公共接口的一部分,这不是它们的本意(至少在c#中)。当你懒得写自己的类来解决一个小问题时,它们就会派上用场了。
我发现它们在字典中特别方便。如果您有一个使用由两个或多个属性组成的键的私有字典,为了使其工作,您需要确保使用按值比较语义并正确实现哈希码(或提供自定义Comparer
)。Tuple
已经为您做了。