我们应该将 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>) 可能会导致较大的值。如果您经常在方法周围传递如此大的值,则最终可能会比仅传递引用更差。但是,如果这无关紧要,您完全可以使用具有方便语法支持的值元组(如果需要,它们仍然可以通过 inref 修饰符通过引用传递)。

【讨论】:

乔尔吉。感谢您的回答,是的,它很有帮助。我的意思是安全(性能,好方法) 我在搜索如果 Tuple 超过 7 个元素,他们将在元素 8 处创建一个新的 ValueTuple,Tupleprnt.sc/xvlf6b See here ***.com/questions/52533742/… 这就是为什么在我的例子中,而不是在 MyCar 类中创建包含 CarClass、CarEngine 的类。然后为我直接看到元组创建一个列表可以很容易,并且可以节省创建许多不需要通用使用的无用类。只在内部。而且我仍然不确定仅适用于引用类型的 Tuple 或 ValueTuple 哪个更好:)

以上是关于我们应该将 Tuple 或 ValueTuple 用于仅引用类型的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

Tuple和ValueTuple

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

详解C# Tuple VS ValueTuple(元组类 VS 值元组)

Tuple和 ValueTuple