如果这个问题已经出现,请道歉:我已经查询了问题并用谷歌搜索过,但没有看到任何解释。
我开始使用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#中有类似的东西吗?
答案 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
。