2011-03-10 82 views
3

我是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 ...”我得到一个错误

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

+0

发布代码的其余部分,包括您的数组的初始化 – smartcaveman 2011-03-10 19:51:11

+5

仅仅因为语法相似并不意味着您应该在C#中编写C代码。 – ChaosPandion 2011-03-10 19:52:35

+1

我不想在C#中编写C语句我只是在说我会如何在C中完成它,而不是我应该做的事情。这就是为什么我问我该怎么做。 – 2011-03-10 20:23:07

回答

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的当前大小和指向内部数组的指针,并且可能还有其他数据。一个int和一个指针,加上所有对象的std开销)。您可以通过向构造函数传递要保留的元素数量来“预设”列表。

+0

当你打败我吧! – CodingGorilla 2011-03-10 19:55:55

+0

当我尝试写入数组时,出现错误。我使用这一行:datas [0] .type = 123; – 2011-03-10 20:20:29

+0

@Nick你会得到什么错误?我测试了代码,没关系。 – xanatos 2011-03-10 20:31:53

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#的内存模型,因为它解释了值类型和引用类型之间的许多细微但重要的差异。

2

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

在C#中你很少使用结构。结构的语义与类的不同。以下是关于何时使用struct v何时使用类的简要说明。有更多的资源可用,我只是抓住了第一个碰到这个问题的结果,似乎是合理的:When to use a struct

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

long[] myArray = new long[50]; 

如果您需要在阵列中存储互操作的目的,您可以通过fixed关键字做到这被固定,但互操作无论如何,当你将托管数组传递给本地函数时,层实际上会为你做这件事。

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

相关问题