F# 什么时候应该使用元组,什么时候应该使用结构?
F# when should you use tuple and when should you use struct?
F# 元组和结构之间的根本区别是什么。它们都可以包含多个变量,但我只想知道何时使用一个变量。
更具体地说,我试图通过一堆函数传递一堆参数,每次都累积一个新变量。例如,我从 param1 开始并将其传递给 returns (param1,param2) 的 func1。然后这个元组(或结构)被传递给 func2,其中 returns (param1,param2,param3),依此类推。
我目前的想法是:有了元组,我总是可以容纳适量的参数,但我放弃了数据的统一格式,最后,我不得不打包和重新打包一个大约 10 个元素的元组。使用结构体,我的优点是参数统一,但问题是,我必须在开始时将参数指定为 null。
在 F# 中,元组使用 Tuple<T1, T2>
表示,这是一种引用类型。另一方面,结构是值类型,因此它们分配在堆栈上而不是堆上(有时可能更快)。所以我的一般规则是:
- 元组在 F# 中有很好的语法支持,所以默认使用元组,因为它们可以使您的代码更好。在大多数情况下,性能相似,您无需担心(这取决于使用情况 - 元组并不总是较慢)。
- 当您的元组变得更复杂时(例如,超过 3 个元素),使用具有命名成员的类型(如记录或对象类型)是有意义的。
- 分配大量元组或结构时,最好使用结构。您可以定义自己的结构或使用标准的 .NET 结构,例如
KeyValuePair<K, V>
.
为了提供轶事证据,在 Deedle 中,我们使用内部结构(时间序列存储为结构数组),但不用于 public API,它使用元组。
F# 元组和结构之间的根本区别是什么。它们都可以包含多个变量,但我只想知道何时使用一个变量。
更具体地说,我试图通过一堆函数传递一堆参数,每次都累积一个新变量。例如,我从 param1 开始并将其传递给 returns (param1,param2) 的 func1。然后这个元组(或结构)被传递给 func2,其中 returns (param1,param2,param3),依此类推。
我目前的想法是:有了元组,我总是可以容纳适量的参数,但我放弃了数据的统一格式,最后,我不得不打包和重新打包一个大约 10 个元素的元组。使用结构体,我的优点是参数统一,但问题是,我必须在开始时将参数指定为 null。
在 F# 中,元组使用 Tuple<T1, T2>
表示,这是一种引用类型。另一方面,结构是值类型,因此它们分配在堆栈上而不是堆上(有时可能更快)。所以我的一般规则是:
- 元组在 F# 中有很好的语法支持,所以默认使用元组,因为它们可以使您的代码更好。在大多数情况下,性能相似,您无需担心(这取决于使用情况 - 元组并不总是较慢)。
- 当您的元组变得更复杂时(例如,超过 3 个元素),使用具有命名成员的类型(如记录或对象类型)是有意义的。
- 分配大量元组或结构时,最好使用结构。您可以定义自己的结构或使用标准的 .NET 结构,例如
KeyValuePair<K, V>
.
为了提供轶事证据,在 Deedle 中,我们使用内部结构(时间序列存储为结构数组),但不用于 public API,它使用元组。