代码之家  ›  专栏  ›  技术社区  ›  György Kőszeg

单元素元组和零元素元组有什么好处?

  •  13
  • György Kőszeg  · 技术社区  · 7 年前

    C#7.0引入了值元组,并为它们提供了一些语言级别的支持。他们 added the support 也包括单元素元组和零元素元组;但是,当它们有用时,我找不到任何场景。

    ValueTuple.Create 重载我可以创建任何类型的元组,但C#7.0语法至少只允许两个元素:

    Microsoft (R) Roslyn C# Compiler version 2.8.3.62923
    Loading context from 'CSharpInteractive.rsp'.
    Type "#help" for more information.
    > ValueTuple.Create()
    [()]
    > ValueTuple.Create(1)
    [(1)]
    > ValueTuple.Create(1, "x")
    [(1, x)]
    

    按元组语法:

    > var t2 = (1, 2);
    > var t1 = (1); // t1 is now int (of course)
    > ValueTuple<int> t1 = (1);
    (1,23): error CS0029: Cannot implicitly convert type 'int' to 'ValueTuple<int>'
    > ValueTuple<int> t1 = new ValueTuple<int>(1);
    > t1
    [(1)]
    

    我想我在哪里找到了线索 this feature was requested 但是现在没有一个代码示例在C中有效,并且在 planned features of C# 8.0 或者,甚至在递归元组模式中也没有。

    在请求线程中提到了函数式编程语言。也许现在有什么函数语言在使用它们吗?我不是一个专家,但它的元组 reference 没有提到使用单元素元组和零元素元组。

    因此,TL;DR提出问题:

    • 单元素元组和零元素元组是否用于任何(可能是函数式的).NET语言?我不是说 Tuple.Create 或者通过构造函数,但是通过本地语言支持。
    • 它们是否计划在未来的C#版本中使用?
    • 或者是为了“以防万一”,为了将来的兼容性?
    4 回复  |  直到 7 年前
        1
  •  10
  •   rmunn    7 年前

    0元组有什么用?

    二元组或三元组表示一组相关项。(二维空间中的点、颜色的RGB值等)1元组不是很有用,因为它很容易被单个元组替换 int .

    0元组似乎更无用,因为它完全不包含任何内容。但是它的一些特性使得它在函数语言中非常有用,比如F#。例如,0元组类型只有一个值,通常表示为 () . 所有0元组都有这个值,所以它本质上是一个单元组类型。在大多数函数式编程语言中,包括F#,这称为 unit 键入。

    返回的函数 void 在C#将返回 单元 输入F#:

    let printResult = printfn "Hello"
    

    在F#交互式解释器中运行它,您将看到:

    val printResult : unit = ()
    

    这意味着 printResult 属于类型 单元 ,并具有 () (空元组是 单元 类型)。

    函数可以 单元 输入作为参数。在F#中,函数可能看起来没有参数。但事实上,他们只接受了一个 单元 . 此函数:

    let doMath() = 2 + 4
    

    实际上相当于:

    let doMath () = 2 + 4
    

    也就是说,接受一个类型的参数的函数 单元 并返回 内景 值6。如果在定义此函数时查看F#交互式解释器打印的类型签名,您将看到:

    val doMath : unit -> int
    

    事实上,所有函数都将接受至少一个参数并返回一个值,即使该值有时是一个“无用”的值,如 () ,这意味着函数组合在F中要比在没有 单元 键入。但那是一个更高级的科目,我们稍后再谈。现在,记住当你看到 单元 在函数签名中,或 () 在函数的参数中,这是0元组类型,用作表示“此函数不接受或返回有意义的值”的方式

        2
  •  3
  •   DevNewb    7 年前

    我想不出一个元素元组的用例。编辑-正如所指出的,引用的页面提到一个元素元组作为命名返回参数的方法,这听起来确实很有用,尽管这可能是C#特定的。

    零元素元组在函数语言中也称为 unit . 它有点像C#中的虚空,其中一些(大多数?)函数式语言没有。

    不同之处在于()是一个实际值,您可以使用它来保存列表、模式匹配等操作。函数式语言需要这样做,因为函数必须返回某些内容,如果您想返回“nothing”,则必须通过返回()显式地执行此操作。您还可以编写一个接受unit作为参数的函数,这基本上意味着它是一个延迟执行的值,很可能会有副作用:

    let x = getFromDb() // will read DB
    stream.Flush() // will change state
    
        3
  •  1
  •   Paulo Morgado    7 年前

    在C中不支持o元组(nople)和1元组(oneple)。

    然而,在基类库(BCL)上,为了保持一致性,为了防止将来有人发现它的用处,有 ValueTuple ValueTuple<T> . 例如,一种具有0元组和1元组结构的语言。

    值元组 有一些附加值。从 the documentation :

    ValueTuple结构表示没有元素的元组。它主要用于它的静态方法,这些方法允许您创建和比较值元组类型的实例。它的helper方法允许您实例化值元组,而不必显式指定每个值元组组件的类型。通过调用它的静态创建方法,可以创建包含从零到八个组件的值元组。对于包含八个以上组件的值元组,必须调用值元组构造函数。

        4
  •  0
  •   Julien Couvreur    7 年前

    目前, ValueTuple'1 仅用于表示长元组,即使没有用于1元组的C元组语法: ValueTuple<T1, T2, T3, T4, T5, T6, T7, ValueTuple<T8>> 是8元组的基础类型。

    对于0元组和 ValueTuple'0 ,我们推测它们可能出现在未来的场景中(如果我没记错的话,可能是一些递归模式)。