.net 4中的一个元组类型是Single-Element Tuple。我只是想知道这个结构的目的是什么?
我看到的唯一用途是在8+ Tuple中使用,因为它可以分配给TRest,它实际上是有意义的。是吗?或者还有其他目的吗?
答案 0 :(得分:18)
您必须要求BCL设计人员确定,但我怀疑由于现实世界中存在1元组,因此.NET框架作者希望在其实现中提供等效的对称性。
Tuples
是您认为mathematical concept of a tuple。
既然你要求Tuple<T>
的编程用途,我会也回答有可能使用Tuple<>
表示的.NET语言(如F#)像函数返回值这样的东西。因为F#函数当然可以返回1元组 - 它增加了语言的行为和感觉的对称性和一致性。
你的8个元组的例子也可能是合法的,因为Rest
属性可以是表示“溢出”的1元组。
答案 1 :(得分:7)
元组自动实现IStructuralComparable
和IStructuralEquatable
等。这样可以直接比较和排序元组。来自Bill McCarthy在2009年12月发表的 Visual Studio Magazine ,“.NET 4中的类型和元组”中的文章:
尽管元组可能看起来简单且不起眼,但它们确实提供了强类型和重要的比较和相等功能。元组在方法,类甚至机器边界上都很有用。
通过将数据类型放入元组中,即使只有一个元素,也可以保证不变性,可公性和可比性。对于仅由一个元素组成的元组,使用元组的主要好处是不可变性:一旦创建了元组,它的数据就不会在元组的生命周期中发生变化。
答案 2 :(得分:4)
所有元组类型都实现ITuple
,所以我想当你想要一个ITuple
的返回类型时,你需要选择一个单独的值,正如你的建议。
答案 3 :(得分:3)
虽然这是一个旧帖子,但我正在准备Why use a 1-tuple, Tuple<T1> in C#?的答案,现在标记为重复。
1-Tuple的一个可能用法是,如果没有值,则返回null实例,但是item值本身为null,并不意味着没有结果。
例如(不是一个非常好的现实生活中的例子,但希望它传达了这一点)
static List<string> List = new List<string> {"a", "b", null, "c"};
static Tuple<string> GetItemAtIndex(int index)
{
if (index < 0 || index >= List.Count)
return null;
return Tuple.Create(List[index]);
}
调用代码会知道当元组本身为null时,它在列表中不存在,但如果Item1为null,则列表中实际上有一个空项。当然,在此示例中,存在大量更好的解决方法,但它也可以应用于数据库中的结果:未找到结果或结果为null。
扩展相同的逻辑,可以使用元组轻松创建可以为任何类型返回null的泛型方法。例如
static Tuple<T> GetSomething<T, RecType>(RecType rec, Func<RecType, T> fn)
{
if (rec == null) return null;
//extra example, access would be checked by something like CheckCurrentUserAccess(rec)
bool AccesDenied = true;
if (AccesDenied) return null; //sometimes you don't want to throw an exception ;)
return Tuple.Create(fn(rec));
}
您可以返回Nullable<T>
,但这只适用于结构,这适用于任何类型,尽管int
,string
,int?
,{{1}等等