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