Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免使用大C#元组加速过度类型化? 动机_C#_Class_Tuples_Instance - Fatal编程技术网

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

如何避免使用大C#元组加速过度类型化? 动机,c#,class,tuples,instance,C#,Class,Tuples,Instance,我——偶尔——尽管CTuple有不足之处,但还是觉得它很有用。 在这些时候,有理由涉足大型Tuples,而不是更为明显的方法,如创建特定类或结构或通用类,例如树状类 它们包括能够在更多的位置/范围内定义元组s。通常在更局部和/或临时的作用域中,例如在需要的地方不可见的函数内部,或者作为返回类型,甚至在数组定义中元组s在某些方面也比普通类和嵌套类(实例化?)的类小。有时,虽然通常是一个弱点,但即使是数据结构,如元组的成员被自动命名为Item1Item2等。。。可能更好 问题 或者更多关于优雅的

我——偶尔——尽管C
Tuple有不足之处,但还是觉得它很有用。



在这些时候,有理由涉足大型
Tuple
s,而不是更为明显的方法,如创建特定类或结构或通用类,例如树状类

它们包括能够在更多的位置/范围内定义
元组
s。通常在更局部和/或临时的作用域中,例如在需要的地方不可见的函数内部,或者作为返回类型,甚至在数组定义中<代码>元组
s在某些方面也比普通类和嵌套类(实例化?)的类小。有时,虽然通常是一个弱点,但即使是数据结构,如元组的成员被自动命名为
Item1
Item2
等。。。可能更好


问题 或者更多关于优雅的问题,请参见上面的“动机”

请参阅此伪C#代码:


更大的尺寸会让情况变得更糟,目前为3.6倍,想象一下这行代码:

byte byte byte byt count = 4;

“问题”
有没有办法避免重复指定类型?

如果您只是想避免多次重新键入类型名称,可以使用:

请注意,这将在可能的情况下使用类型推断,因此如果需要生成一个使用无法从参数直接推断的类型的
元组
(例如在
4
文本的情况下为基类型或
ushort
),您必须在调用
Tuple.Create
时进行一些有意的强制转换或明确指定类型

不过,有时您必须拼出整个类型名,例如,在类型成员或方法签名中。在这种情况下,您可以使用C#的一个经常被忽略的特性,即:

使用MyTuple=Tuple;
...
公共类MyClass
{
公共MyTuple MyFunc(MyTuple foo,MyTuple bar){…}
}
如果没有别名,上面显示的方法的签名将是绝对可怕的。当然,您也可以自由地混合和匹配别名,这意味着复杂的泛型类名可以分解为越来越简单的形式,直到它们变得更易于管理


但是,我仍然建议尽可能使用正确设计的类。

如果您只是想避免多次重新键入类型名称,可以使用:

请注意,这将在可能的情况下使用类型推断,因此如果需要生成一个使用无法从参数直接推断的类型的
元组
(例如在
4
文本的情况下为基类型或
ushort
),您必须在调用
Tuple.Create
时进行一些有意的强制转换或明确指定类型

不过,有时您必须拼出整个类型名,例如,在类型成员或方法签名中。在这种情况下,您可以使用C#的一个经常被忽略的特性,即:

使用MyTuple=Tuple;
...
公共类MyClass
{
公共MyTuple MyFunc(MyTuple foo,MyTuple bar){…}
}
如果没有别名,上面显示的方法的签名将是绝对可怕的。当然,您也可以自由地混合和匹配别名,这意味着复杂的泛型类名可以分解为越来越简单的形式,直到它们变得更易于管理


然而,我仍然建议尽可能使用设计合理的职业。

一千个职业的灵魂都在尖叫,试图走出去,展现自己。然而,你已经压垮了他们,他们曾经拥有的有意义的名字现在已经消失了。你的代码渴望简单和敏感,但找不到答案。

上千个阶层的灵魂都在尖叫,试图走出去展示自己。然而,你已经压垮了他们,他们曾经拥有的有意义的名字现在已经消失了。你的代码过于简单和敏感,但找不到答案。

我看不到问题……把它放到一个类中。使用
Tuple
,你隐藏了很多含义。假设这是
Tuple
,其中一个表示宽度/高度。很难知道哪个是哪个。使用Tuple。创建静态方法来获得泛型类型推断。我看不到问题…将其放在类中。使用
Tuple
,可以隐藏很多含义。假设这是
Tuple
,其中一个表示宽度/高度。很难知道哪个是哪个。使用Tuple。创建静态方法来获得泛型类型推断。我的代码中只有很少一部分是这样的,OFC我通常使用类,为了更好地说明这一点,我整理了这个问题。类有其局限性,C++需要与C++最近发生的相同的更新,除了C++没有工作得很好,它仍然不如C ^::“Aln2-这里”C需要与C++最近发生的相同的更新:“你到底指的是什么?C++ 11,有了新的特性,我的代码中只有一小部分是这样的,我通常使用类,我已经整理了这个问题,以便更好地说明这一点。类有其局限性,C++需要与C++最近发生的相同的更新,除了C++没有工作得很好,它仍然不如C++的好:“@ Aln2-这里”C需要与C++最近发生的相同的更新,“你到底指的是什么?C++ 11,具有新的特性。
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)));
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
byte byte byte byt count = 4;
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)));
using MyTuple = Tuple<Tuple<float, float>, Tuple<Tuple<box, box, UInt16>, Tuple<float, float, float, float>>>;
...

public class MyClass 
{
    public MyTuple MyFunc(MyTuple foo, MyTuple bar) { ... }
}