.net中的元组(T1)/ Singleton的目的是什么?

时间:2010-06-25 19:55:03

标签: .net tuples

.net 4中的一个元组类型是Single-Element Tuple。我只是想知道这个结构的目的是什么?

我看到的唯一用途是在8+ Tuple中使用,因为它可以分配给TRest,它实际上是有意义的。是吗?或者还有其他目的吗?

4 个答案:

答案 0 :(得分:18)

您必须要求BCL设计人员确定,但我怀疑由于现实世界中存在1元组,因此.NET框架作者希望在其实现中提供等效的对称性。

Tuples是您认为mathematical concept of a tuple

的.NET实现

既然你要求Tuple<T>的编程用途,我会回答有可能使用Tuple<>表示的.NET语言(如F#)像函数返回值这样的东西。因为F#函数当然可以返回1元组 - 它增加了语言的行为和感觉的对称性和一致性。

你的8个元组的例子也可能是合法的,因为Rest属性可以是表示“溢出”的1元组。

答案 1 :(得分:7)

元组自动实现IStructuralComparableIStructuralEquatable等。这样可以直接比较和排序元组。来自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>,但这只适用于结构,这适用于任何类型,尽管intstringint?,{{1}等等