Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 作为结构的.NET集合_C#_Collections - Fatal编程技术网

C# 作为结构的.NET集合

C# 作为结构的.NET集合,c#,collections,C#,Collections,这里有一个有趣的问题。。。是否有一个集合是.net framework中的某个结构 只是澄清一下,所有现有集合(列表、数组等)都是引用类型。。。即使将泛型参数设置为值类型。但我想知道是否有一种方法可以使集合实际上是一个结构。我显然不打算把这件事传出去(这会导致大量的抄袭)。。。我将它作为类(内部状态)中的私有成员保留,因此它只定义一次。我的想法是,我将能够避免仅仅为了进行一个小的收集而调用垃圾收集器(想想XNA) 假设一个不存在,问题的第二部分是,什么是理想的数据结构。链表?不,这样的类型不存在

这里有一个有趣的问题。。。是否有一个集合是.net framework中的某个结构

只是澄清一下,所有现有集合(列表、数组等)都是引用类型。。。即使将泛型参数设置为值类型。但我想知道是否有一种方法可以使集合实际上是一个结构。我显然不打算把这件事传出去(这会导致大量的抄袭)。。。我将它作为类(内部状态)中的私有成员保留,因此它只定义一次。我的想法是,我将能够避免仅仅为了进行一个小的收集而调用垃圾收集器(想想XNA)


假设一个不存在,问题的第二部分是,什么是理想的数据结构。链表?

不,这样的类型不存在,这不是一个好主意。根据Microsoft指南,结构应该是小的不可变值类型

从:

  • 像原始类型一样操作
  • 实例大小小于16字节
  • 它们是不变的
  • 价值语义是可取的
将链表实现为值类型很困难,因为链表通常是递归定义的。这很好:

class Node<T>
{
    public T Value;
    public Node<T> Next;
}
类节点
{
公共价值观;
公共节点下一步;
}
但这会失败,因为结构具有固定大小,并且在定义结构时必须知道该大小:

struct Node<T>
{
    public T Value;

    // Error: Struct member 'Node<T>.Next' of type 'Node<T>'
    // causes a cycle in the struct layout
    public Node<T> Next; 
}
struct节点
{
公共价值观;
//错误:结构成员节点。下一个节点类型为节点
//在结构布局中导致循环
公共节点下一步;
}

实际上,有一个结构是一个集合
BitVector32
是一个结构,其作用类似于32个布尔值、4个字节或2个短值的集合。当你想做点闲扯的时候,它很方便,但不想太多的考虑创建面具之类的

另外,如果您确实计划自己滚动,请注意,如果您让它实现类似于
IList
的东西,您永远不应该将其发送到类似这样的代码中

public static void SomeMethod(IList<Int32> list)
{
       ....
}
publicstaticvoidsomethod(IList列表)
{
....
}
因为这会将其装箱,每个成员的访问很可能会导致装箱,而不是将其发送到具有以下签名的方法:

public static void SomeMethod<T>(T list) where T:IList<Int32>
{
       ....
}
publicstaticvoidsomethod(T list),其中T:IList
{
....
}

如第二个示例所示,在每个callvirt之前将发出
约束的
操作码,这将在调用结构成员时避免装箱。祝你好运

不过,Eric Lippert有一系列关于不可变集合类型的博客:)啊,我明白你的意思了。。。好的,我不知道这会导致编译错误。谢谢:-)理论上,您可以创建一个结构并实现IList或Icollection接口,这样您仍然有一个值类型。我不确定它是否会有多大帮助。啊,但我想这里的交易是,它是一个已知大小的集合。我想在sizeEh中找到一些更模糊的东西。还有
ArgIterator
\uu arglist
这两个几乎不受支持的项目。你也可以通过使用接口来访问下一个节点成员来伪造它,但是你的拳击很糟糕。好的一点,尽管我会将你的
中的“从不”更改为“从不”:如果你在处理为性能而设计的代码(例如游戏)中的非基本结构,你不应该将它发送到code
中,有时不:)@nawfal最好是极其谨慎。使用
ref
参数传递,避免装箱。在.NET4.5中使用受约束的泛型方法构造实际上更好,因为它具有一些真正的魔力,可以使接口调用虚拟化!这允许在JIT认为合适时内联方法体。这也有一些好处,因为您可以避免有时用于结构实例方法的引用传递样式的开销。@MichaelB是的,但正如我所说的,这些在grand scheme中是罕见的。我注意到了这一点,在你的回答中给出了概括的陈述。顺便说一句,你说的.NET4.5中的
约束泛型方法构造是什么意思?