我偶尔‗尽管有不足之处,但发现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
有没有办法避免重复规范类型?
答案 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)
一千个阶级的灵魂尖叫,试图走出去并表现自己。然而,你已经粉碎了他们提交,他们曾经拥有的 有意义的名字现在已经丢失了。您的代码为简单性和敏感性而烦恼,但没有找到回答。