当结构包含数组/列表时,创建数组/结构列表

时间:2011-03-10 19:49:33

标签: c# arrays list struct

我是C#的新手,通常是C程序员,因此我无法找出最佳使用方法。希望我能得到一些建议来帮助我做出决定 我有一个看起来像这样的结构(我这样做我将如何在C中完成):

struct structData
{
    long type;
    long myArray[50];
    string text;
}

我创建了这些结构的数组,我可以不断地全局/公开地读/写。 (我需要将数据存储在那里,以便稍后访问)

structData arrayOfStructs[50];  

目标是访问这样的数据:

arrayOfStructs[0].type = 123;
arrayOfStructs[0].myArray[0] = 456;

当我尝试在C#中实现它时,我会遇到各种错误:
myArray”需要固定为50,但需要处于不安全区域 如果我尝试初始化它“... = new ...”我收到错误

首先,我应该使用List<>而不是数组?是否有性能差异?
其次,我应该创建一个类而不是结构,在构造函数中初始化数组,然后创建对象的列表/数组?你会如何实现这个?
是的,我需要使用多头。

3 个答案:

答案 0 :(得分:4)

public class StructData
{
    public long type;
    public long[] myArray = new long[50];
    public string text;
}

StructData[] datas = new StructData[100];

for (int i = 0; i < datas.Length; i++)
{
    datas[i] = new StructData();
}

为大对象使用类,为小的和可能不可变的“对象”使用结构(假设结构应该很小且不可变。但是你可以想要它们) 要清楚,我在.NET中知道的最好的结构由4个int组成(它是Guid)。我认为这对小型大型结构来说是一个很好的基准。

如果需要扩展集合,使用List,如果大小固定,则使用数组,List不比数组慢(它们在内部使用数组)。我不知道是否有人曾将数组基准测试到List。 List通常比数组使用更多的内存,因为它保留了一点空间来扩大集合(并且它保持List的当前大小和指向内部数组的指针,也许还有其他数据。所以它至少更大一个int和一个指针,加上所有对象的std开销。您可以通过向构造函数传递要保留的元素数来“预设”List。

答案 1 :(得分:2)

所以,首先我要说你应该避免在C#中编写C代码的诱惑。除了明显的语法相似性之外,这两种语言几乎没有共同之处。

在C#中,你很少使用结构。结构的语义与类的语义不同。以下是关于何时使用struct v何时使用类的快速概述。有更多可用的资源,我只是抓住了第一个涉及该主题的结果并且似乎是合理的:When to use a struct

其次,是的,您应该尽可能使用通用容器类型。性能不会成为问题,从长远来看,它将使您的生活变得更加轻松。声明数组的语法是关闭的(它与C不同),应该是:

long[] myArray = new long[50];

如果您需要将数组固定在内存中以实现互操作,可以通过fixed关键字完成此操作,但是当您将托管数组传递给本机函数时,互操作层实际上会为您执行此操作。

我建议您花一些时间从头开始学习C#,并忘记语法类似于C的事实。它们是完全不同的语言,具有完全不同的语义和最佳实践。

答案 2 :(得分:0)

如果你需要本机互操作性,也就是说,你要通过某种机制编组这些类型,或者简单地围绕字节数组,那么你需要这个不安全/固定的东西,它可以像这样完成。

unsafe struct structData 
{     
    int type;
    fixed int myArray[50]; // long is 64-bit in C# was that intentional?
    string text; // string is a managed type
}

来自C,你绝对不应该将C代码直接翻译成C#等价物,因为这没有多大意义。在C#中,管理的东西通常会接受与托管代码相关的成本,并且不会考虑该级别的性能影响,而不是最初。

一个好的起点是研究C#的内存模型,因为它解释了值类型和引用类型之间的许多微妙但重要的差异。