这是一个有趣的问题...... 是在.net框架中的某个结构的集合吗?
只是澄清一下,即使您将泛型参数设置为值类型,所有现有集合(列表,数组等)都是引用类型。但我想知道是否有一种方法可以制作一个实际上是结构的集合。我显然不打算传递它(这将导致大量的复制)...我会把它作为我班级的私人成员(内部状态),所以它只定义一次。我的想法是,我可以避免调用垃圾收集器只是为了制作一个小集合(想想XNA)。
假设一个不存在,问题的第二部分是,这将是什么是理想的数据结构。链表?
答案 0 :(得分:8)
不,这种类型不存在,这不是一个好主意。根据Microsoft指南,结构应该是小的不可变值类型。
来自Value Type Usage Guidelines:
- 像原始类型一样行事。
- 实例大小不超过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;
}
答案 1 :(得分:4)
实际上有一个结构是一个集合。 BitVector32
是一个结构,其行为类似于32个布尔值,或4个字节或2个短裤的集合。当你想做bittwidling但不想过多考虑创建蒙版等时,这非常方便。
另外,如果您真的计划自己滚动,请注意,如果您实现类似IList<Int32>
之类的内容,则不应将其发送到类似
public static void SomeMethod(IList<Int32> list)
{
....
}
因为那会将它打包并且每个成员访问很可能导致拳击而不是将其发送到具有此签名的方法::
public static void SomeMethod<T>(T list) where T:IList<Int32>
{
....
}
由于第二个示例将在每个callvirt之前发出constrained
操作码,这将在调用struct成员时避免装箱。祝你好运。