C#:基本类型数组与类数组

时间:2016-09-29 10:36:41

标签: c# arrays

如果这个问题已经出现,请道歉:我已经查询了问题并用谷歌搜索过,但没有看到任何解释。

我开始使用C#,经过近30年的C,几个月的Java和15年前的几年C ++ ......这可以解释我的困惑。 在C#中,如果我想要一个int数组,我可以这样做:

int[] a = new int[10];

此时,我可以访问数组的元素

a[0] = 1; // This is OK

我现在有一个类(比如,SomeClass),我想创建一个这样的数组:

SomeClass[] o = new SomeClass[10]

我希望(对称性)我可以访问数组的元素,但是

a[0].someField = val; // exception, must do a[0] = new SomeClass(); first

所以,第一个new[]实际上只分配10个指针,而不是10个对象,尽管有语法。我必须重复一遍,我对C#的了解并不完美(:)),所以如果我错了请纠正我,但另一个问题(除了我认为值和引用之间的混淆)是内存碎片: CI将分配10个“指针”(malloc(10 * sizeof (void *));,然后分配整个区域(malloc(10 * sizeof (SomeClass)),然后使用偏移来初始化指针数组以指向malloc'd区域,最小化内存碎片...... C#中有类似的东西吗?

1 个答案:

答案 0 :(得分:2)

与具有类实例的类类型的C ++数组不同,类类型的C#数组创建一个引用数组。这类似于创建指针的C ++数组:

SomeClass *o[10] = {0};

在对o[i]进行任何访问之前,您需要为其分配一个新对象:

cout << o[0]->a;      // ERROR: o[0] is nullptr
o[0] = new SomeClass; // Assign a new object
cout << o[0]->a;      // Works fine

这与它在C#中的工作方式相同:在访问其属性之前,必须将对象分配给数组元素。

您不需要对C#中的int执行相同操作的原因是int是值类型。声明值类型数组会使用默认值填充元素。这也适用于用户定义的struct