在F#中,语法糖隐藏了CLR实现,为什么不在C#4.0中?
答案 0 :(得分:9)
我们考虑为元组添加一个语法糖。我想每个人都认为这是一个很好的功能,但它根本不符合预算。
答案 1 :(得分:3)
使用C#语言的特性达到适当级别的人似乎不太可能需要包含7个以上元素的元组,特别是考虑到现有的和已建立的解决问题的技术以及C#主要用于解决方案开发的方法。
另一方面,F#是一种主要用于实现功能的语言。因此,它以主要功能的方式执行操作,语言功能专注于该主要概念。结果,花费在F#中提供语言功能所需的资源比在C#中提供的资源更有意义。请记住all new language features start with 100 points against them。 :)
答案 2 :(得分:3)
以下是Matt Ellis在基类库(BCL)团队中的一篇很好的MSDN文章,该文章正是他们对此问题的看法以及与Tuple
类相关的一些其他关键问题。
构建元组:http://msdn.microsoft.com/en-us/magazine/dd942829.aspx
由于.NET泛型的设计,泛型类型参数的数量在编译时是固定的。因此,他们必须选择一些通用参数来执行。该文章解释说,它是在现有的Action
和Func
代表上进行模式化的。具有讽刺意味的是,随后添加了Action
和Func
的其他代表,其中通用类型参数的数量最多为16,但Tuple
开发人员并未效仿。
答案 3 :(得分:3)
这是我的猜测,但我怀疑另一个因素是F#有一个相当精细的机制来存储特定于语言的元数据。需要有一些方法来区分“最后一个元素是3元组的7元组”和9元组,即使它们在.NET类型方面以相同的方式编码。 F#通过自定义元数据blob实现这一点,就像它使用元数据来存储比.NET内置的约束更具表达性的约束(例如枚举或成员约束)。 C#没有使用程序集存储精细的,特定于语言的元数据的历史记录,其中某些形式是处理扩展元组的必要先决条件(尽管在这种情况下自定义属性可能就足够了)。
答案 4 :(得分:2)
嗯,对你的问题的简单回答是C#没有为使用元组提供任何语法糖,所以当超过8时,它无法隐藏元组的嵌套元素。
当然,我猜你实际上是在问为什么在C#4.0中使用元组没有语法糖。我认为它不存在的主要原因是它鼓励轻量级编程风格,这在C#中通常不受支持(但对F#程序员来说效果很好)。
在F#中,编写如下代码非常好:
let parseRecord rc =
// some code to parse the argument
let (left, top, wid, hgt, str) = parseRecord record
但是,此代码仅在开发过程的早期阶段(编写一些原型和实验时)或者功能非常本地化(在一个函数中使用)才合理。在更进化的代码版本中,您可能会用一些更合适的数据结构(例如F#记录)来替换它,以使代码更具可读性,我认为这是人们通常在F#中做的事情< / p>
另一方面,如果C#propgrammer编写了类似下面代码的内容,人们会非常害怕代码是多么难以理解:
{ int, int, int, int, string } ParseRecord(string record) {
// some code to parse the argument
}
var (left, top, wid, hgt, str) = ParseRecord(record);
所以,我认为C#中的整体编程风格不太适合像元组上的元组和模式匹配这样的轻量级特性,因为它与其他语言的效果不太一样。
当然,在C#中可能有一些更好的方法来支持它,并且可能会在将来添加它,但是我认为这个功能的集成比F#更复杂。此外,匿名类型与元组具有相似的目的(但仅限于本地),因此在某些情况下,您实际上不需要C#中的元组。