如何避免使用大型C#元组加速过度?

时间:2014-01-02 02:43:08

标签: c# class tuples instance


动机

我偶尔‗尽管有不足之处,但发现C#Tuple很有用。


在这些时候,有一些理由涉及更多最初显而易见的方法,例如创建特定的类或结构或通用,例如类似树的类。{/ p>

它们包括能够在更多地方/范围内定义Tuple。通常在更多本地和/或临时范围内,例如内部函数,在需要的地方和其他地方不可见,或者作为返回类型,甚至在数组定义中。 Tuple在某些方面也比普通类和那些具有(实例化的?)嵌套类的体积小。有时,虽然通常是一个弱点,但即使像Tuple成员的感觉被自动命名为Tuple Item1等等,数据结构也是可取的。


问题

或者更优雅的问题,请参阅上面的“动机”。

请参阅此伪C#代码:

Item2

但是如下面的实际代码所示,所需的类型名称重复次数超线性地增加到节点/成员的数量。

var t = new Tuple<
    Tuple<float, float>,
    Tuple<
        Tuple<box, box, UInt16>,
        Tuple<float, float, float, float>>>
    ((1.5, 1.5), (
        (new box(2, 2), new box(3, 2), 4),
        (1.5, 1.8, 1.6, 1.8)));

var t = new Tuple<
    Tuple<float, float>,
    Tuple<
        Tuple<Box, Box, UInt16>,
        Tuple<float, float, float, float>>>
    (new Tuple<float, float>(1.5, 1.5),
    new Tuple<Tuple<box, box, UInt16>, Tuple<float, float, float, float>>(
        new Tuple<box, box, UInt16>(new box(2, 2), new box(3, 2), 4),
        new Tuple<float, float, float, float>(1.5, 1.8, 1.6, 1.8)));


它会变得更糟,更大的尺寸,到目前为止是3.6倍,想象一下这行代码:

nodes: 14
that are leaves: 8
types stated in first example: 14

types stated in the C-Sharp code: 38
    If all leaves were classes, like `box`: 45
    In a 31 node, 16 leaf, binary tree: 113

‗Question‗

有没有办法避免重复规范类型?

2 个答案:

答案 0 :(得分:5)

如果您只是想避免重复输入类型名称,可以使用Tuple.Create

var t = 
    Tuple.Create(
        Tuple.Create(1.5, 1.5),
        Tuple.Create(
            Tuple.Create(new box(2, 2), new box(3, 2), (ushort)4),
            Tuple.Create(1.5, 1.8, 1.6, 1.8)));

请注意,这将尽可能使用类型推断,因此如果您需要生成使用无法从参数直接推断的类型的Tuple(例如基类型或{{1}在ushort字面值的情况下,您必须进行一些有意识的转换或明确指定对4的调用中的类型。

但是,有时您 要拼出整个类型名称,例如,在类型成员或方法签名中。在这种情况下,您可以使用C#经常被忽略的功能type alias

Tuple.Create

上面显示的方法的签名将是绝对可怕的而没有别名。当然,您也可以自由地混合和匹配别名,这意味着复杂的泛型类名称可以分解为更简单和更简单的形式,直到它们变得更易于管理。

但是,我仍然建议尽可能使用设计合理的课程。

答案 1 :(得分:1)

一千个阶级的灵魂尖叫,试图走出去并表现自己。然而,你已经粉碎了他们提交,他们曾经拥有的 有意义的名字现在已经丢失了。您的代码为简单性和敏感性而烦恼,但没有找到回答