Tuple Tuesday!

[原文发表地址]: Tuple Tuesday!

[原文发表时间]: May 31, 2016

在不久的将来,我们试图将元组作为一项核心功能加入到VB和C#中。如果你还没有听说元组,那可以将它理解为是一种把多种值组合在一起的基础数据结构。像.NET里面的 F#, 有许多编程语言已支持它多年,然而在 Visual Basic中不支持确实有些奇怪了。元组就像数组一样,它是一个捆绑了多个值作为一个单元,而除了数组中每个元素具有相同的类型,在元组中每个元素可以有不同的类型。所以,如果我发现在我的程序中,我总是需要同时传两个值,那么我就可以把它们组合成一个元组:

不使用元组的情况…

image

 

使用元组的情况…

image

在上面的例子中,我们可以用包含2个整型的元组作为方法的参数,而不是在方法之间单独传递两个整型参数。这样能使我们更加清楚的知道这些值被作为一个单元来处理。在本例中我 使用了存在于.NET 4.0及以上版本里的通用元组类型System.Tuple (of T1,T2)。你今天也可以这样使用,只是有两个缺点。第一,系统。Tuple(of T1,T2) 以及和它关联的类型都是类,因此每次你创建一个Tuple(of T1,T2)类型,它都会在堆上分配的一个新的对象。在VB和C#中,我们正在考虑使用一套新的值类型的元组类型,如ValueType(Of T1, T2)分配内联地址,这样更方便于使用元组。第二,在收到大量关于元组名称有多重要的客户的反馈后,内置VB(和C#)元组将具有名称:

image

这意味着你将拥有所有声明自己结构但带有轻量语法的自文档化名称。这有点类似于VB里的匿名类型,同时可以在方法外传值。这使得VB元组具有了像F#语言中元组和记录的所有特点。我们觉得这简直太完美了。

尽管简洁,但仅仅一起传递多个数据并不会太有吸引力,对于元组最耀眼的部分是返回多个值。如果没有元组你需要写这样一种方法,将两个数相除并返回商和余数:

image

因为VB函数总是精确的返回一个值,如果你想要返回额外的值就需要在调用方法中传递ByRef变量。或者,你自己可以在你的代码中声明QuotientAndRemainder结构,但老实说又有谁想要在自己的项目中,为了一个返回值,创建一个名字有些滑稽的方法类型呢?如果有了元组,你就不必进行这些权衡:

image

作为一种语言,它的目标是可读的和易理解的,我认为这是迄今为止最简单和最直接的方式去从一个函数返回多个值。我们认为元组的使用,极大的方便了在工程里传递和返回多个值。当使用强大的异步功能时,这个优势更加突出,因为在异步函数中你甚至不能有ByRef参数。今天你将需要声明一个特殊的结构,或使用数组(如果所有的值都具有相同的类型),或者使用元组类型却丢掉有意义的名称。使用元组,你可以拥有所有的方便之处。

image

此方法通过网络从数据库中提取一些数据,所以它应该是异步的并且遍历所有的订单来计算有用的统计信息,如所有订单的总值,平均订单数和订单的数量。如果没有元组你将不得不在你的项目中添加一个非常讨厌的TotalAverageAndCount类型。

目前,关于在Visual Basic中元组的完整设计策略,可以通过阅读design notes on GitHub来了解,包括用一些其他方式将元组集成到其它语言中。请在GitHub中留下关于Tuple功能设计上的反馈或者在下面进行评论。

上周,我绞尽脑汁地想提出一个好的双关语来介绍元组,导致这篇文章会比原计划晚了一周。“Tuple Tuesday”算是一个较好的选择吧。为了避免混淆,VB语言设计团队为正在添加的那些功能积极集思广益出了许多双关语。我认为下一个设计主题将是 “Visual Basic and Patterns – A Match Made In Heaven!” (我认为这将给VB添加一个全新的维度)-敬请期待。在此之前,依旧快乐编程吧!

Regards,

-ADG