我们应该将 Tuple 或 ValueTuple 用于仅引用类型的变量吗?
Posted
技术标签:
【中文标题】我们应该将 Tuple 或 ValueTuple 用于仅引用类型的变量吗?【英文标题】:Should we use Tuple or ValueTuple for reference-type only variables? 【发布时间】:2021-05-04 07:04:42 【问题描述】:有很多问题只包含 Tuple(class)
与 ValueTuple(struct)
之间的区别
在没有 GC 压力的情况下,ValueTuple
全部消失。但是我对为什么ValueTuple
接受所有数据类型还不够了解呢?为什么不只是 ValueTuple
只接受他们设计为结构的结构。
一目了然。将 Reference-Types 与 ValueTuple 一起使用是否安全且性能更高?
例子
ValueTuple<CarClass, EngineClass> CarBody
我们走吧
Tuple<CarClass, EngineClass> CarBody
我看到的所有示例都包含ValueTuple<int, int, long, structs only>
它是否仅用于此目的?我使用的许多代码都使用ValueTuple<ReferenceTypes>
【问题讨论】:
不安全是什么意思?如果将结构分配给另一个变量,则结构中的引用会复制其引用(指向实例的引用,而不是实例本身)。此外,您应该使用(CarClass Car, EngineClass Engine)
语法而不是 ValueTuple<CarClass, EngineClass>
,因为它允许您命名您的成员,而不是将它们称为 Item1、Item2 等,从而减少出错的可能性。
【参考方案1】:
为什么不只是
ValueTuple
只接受它们设计为结构的结构?
结构总是可以有引用。也没有什么能阻止您使用KeyValuePair<CarClass, EngineClass>
,其中KeyValuePair<TKey, TValue>
也是一种值类型。
在没有 GC 压力的情况下,
ValueTuple
全部消失。
这里肯定有误会。当然,GC 会跟踪具有引用类型参数的值元组。这只是意味着没有额外压力,因为将一些引用分组到ValueTuple
。另一方面,使用Tuple<>
意味着额外的引用,这显然有一些额外的GC成本。
将引用类型与 ValueTuple 一起使用是否安全?
这里有点不清楚安全是什么意思,但是是的,它肯定是安全的。
是否比其他更好取决于使用情况。许多参数 (ValueTuple<int, int, long, other structs>
) 可能会导致较大的值。如果您经常在方法周围传递如此大的值,则最终可能会比仅传递引用更差。但是,如果这无关紧要,您完全可以使用具有方便语法支持的值元组(如果需要,它们仍然可以通过 in
或 ref
修饰符通过引用传递)。
【讨论】:
乔尔吉。感谢您的回答,是的,它很有帮助。我的意思是安全(性能,好方法) 我在搜索如果 Tuple 超过 7 个元素,他们将在元素 8 处创建一个新的 ValueTuple,Tuple以上是关于我们应该将 Tuple 或 ValueTuple 用于仅引用类型的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章
详解C# Tuple VS ValueTuple(元组类 VS 值元组)
详解C# Tuple VS ValueTuple(元组类 VS 值元组)
详解C# Tuple VS ValueTuple(元组类 VS 值元组)