要设计解决的元组有什么要求?

Cha*_*eus 94 c# tuples

我正在研究元组的新C#特性.我很好奇,元组设计要解决什么问题?

您在应用中使用了什么元组?

更新

感谢到目前为止的答案,让我看看我是否在脑子里直截了当.已经指出了元组的一个很好的例子作为坐标.这看起来不错吗?

var coords = Tuple.Create(geoLat,geoLong);
Run Code Online (Sandbox Code Playgroud)

然后像这样使用元组:

var myLatlng = new google.maps.LatLng("+ coords.Item1 + ", "+ coords.Item2 + ");
Run Code Online (Sandbox Code Playgroud)

那是对的吗?

Eri*_*ert 117

在编写程序时,想要逻辑地将一组值组合在一起是非常普遍的,这些值没有足够的通用性来证明创建类.

许多编程语言允许您在逻辑上将一组不相关的值组合在一起,而无需仅以一种方式创建类型:

void M(int foo, string bar, double blah)
Run Code Online (Sandbox Code Playgroud)

逻辑上,这与采用一个参数的方法M完全相同,该参数是int,string,double的3元组.但我希望你不会真正做到:

class MArguments
{
   public int Foo { get; private set; } 
   ... etc
Run Code Online (Sandbox Code Playgroud)

除非MArguments在业务逻辑中有其他含义.

"在一些比一个类更轻量级的结构中将一组其他不相关的数据组合在一起"的概念在很多很多地方都很有用,而不仅仅是方法的形式参数列表.当一个方法有两个要返回的东西,或者你想要从两个数据而不是一个数据中键入字典时,它很有用,依此类推.

像F#这样支持元组类型的语言本身为用户提供了很大的灵活性; 它们是一组非常有用的数据类型.BCL团队决定与F#团队合作,为框架标准化一种元组类型,以便每种语言都能从中受益.

但是,此时C#中的元组没有语言支持.元组只是与任何其他框架类一样的另一种数据类型; 他们没什么特别的.我们正在考虑在假设的未来版本的C#中为元组添加更好的支持.如果有人对你希望看到哪些涉及元组的功能有任何想法,我很乐意将它们传递给设计团队.现实场景比理论思考更有说服力.

  • 虽然元组很有用,但一个很大的缺点就是清晰度.很难阅读和理解引用"Item1","Item2"等的代码......如果元组在C#中实现语言支持,那么允许其成员被命名(或至少是别名)是很棒的允许使用它们的代码更容易理解的方式.在这样一个谦逊的未来,我也希望将具有适当"形状"的元组视为采用单个参数的方法的合法参数(反之亦然).所以,`Tuple <int,string,bool>`可以传递给`M(int,string,bool)`.这将使记忆方法更容易. (60认同)
  • 这些"元组"基本上都是`public` access,_anonymous_`struct`类型,带有_unnamed members_.我宁愿让程序员用命名成员编写一个`struct`并返回它,而不是处理一个不会告诉我任何关于其成员语义的`tuple`. (2认同)
  • @ Hi-Angel:您可能不会参与"如果您想通过名称访问您的方法参数,那么您应该创建一个单独的类",因为这看起来非常沉重,但它似乎很重,因为我们已经习惯了在调用方法*时,能够立即将一组任意变量与任意类型和名称*联系在一起.想象一下,没有语言有这个功能; 每个方法只能接受一个参数,如果你想传递两个,你必须创建一个类型并传递它的一个实例. (2认同)

Eva*_*ice 22

元组提供集合的不可变实现

除了元组的常见用法:

  • 将常用值组合在一起而无需创建类
  • 从函数/方法返回多个值
  • 等等...

不可变对象本质上是线程安全的:

不可变对象在多线程应用程序中很有用.多个线程可以对不可变对象表示的数据起作用,而不用担心其他线程正在更改数据.因此,不可变对象被认为比可变对象更具线程安全性.

来自维基百科上的"不可变对象"


Tob*_*oby 12

它提供了一种替代方法,ref或者out如果您有一个方法需要返回多个新对象作为其响应的一部分.

它还允许您使用内置类型作为返回类型,如果您只需要将两个或三个现有类型混搭,并且您不希望仅为此组合添加类/结构.(曾经希望函数可以返回一个匿名类型吗?这是对这种情况的部分答案.)


Ste*_*ary 10

拥有"对"类型通常很有帮助,只在快速情况下使用(比如从方法中返回两个值).元组是F#等函数式语言的核心部分,C#在此过程中将它们选中.


Kei*_*las 5

从函数返回两个值非常有用