Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:基本类型数组与类数组_C#_Arrays - Fatal编程技术网

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

C#:基本类型数组与类数组,c#,arrays,C#,Arrays,如果这个问题已经出现,我道歉:我已经查看了所问的问题,并在谷歌上搜索了一下,但没有看到任何解释 我开始使用C++,经过了将近30年的C,几个月的java和15年前的C++两年…这也许可以解释我的困惑。 在C#中,如果我想要int数组,我可以执行以下操作: int[]a=新的int[10] 此时,我可以访问数组的元素 a[0]=1;//这没问题 现在我有了一个类(比如SomeClass),我想创建一个如下数组: SomeClass[] o = new SomeClass[10] 我希望(对称性)

如果这个问题已经出现,我道歉:我已经查看了所问的问题,并在谷歌上搜索了一下,但没有看到任何解释

我开始使用C++,经过了将近30年的C,几个月的java和15年前的C++两年…这也许可以解释我的困惑。 在C#中,如果我想要int数组,我可以执行以下操作:

int[]a=新的int[10]

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

a[0]=1;//这没问题

现在我有了一个类(比如SomeClass),我想创建一个如下数组:

SomeClass[] o = new SomeClass[10]
我希望(对称性)可以访问数组的元素,但是

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

因此,第一个
new[]
实际上只分配10个指针,而不是10个对象,尽管语法不同。我必须重申,我对C的了解并不完美(:),所以如果我错了,请纠正我,但这方面的另一个问题(除了我认为的值和引用之间的混淆)是内存碎片:使用C,我会分配10个“指针”(
malloc(10*sizeof(void*));
,然后分配整个区域(
malloc(10*sizeof(SomeClass)),然后使用偏移量初始化指针数组,指向刚才的区域,最小化内存碎片……C++中有类似的类似之处吗?< /P> < P>不同于类类的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
cout a;//错误:o[0]为空ptr
o[0]=new SomeClass;//分配一个新对象
cout a;//工作正常
这与它在C#中的工作方式相同:在访问数组元素的属性之前,必须将对象指定给数组元素


<> P> >在C++中,不需要用<代码> int >代码>相同的是,<代码> int >代码>是一个值类型。声明一个值类型数组会填充默认值的元素。这也适用于用户定义的<代码>结构> < />代码>。你可以有一个类实例数组,就像你可以有一个
std::vector
实例数组一样。如果你把它改成
SomeStruct
当然,你必须在其中添加一些东西,然后才能访问它,但是你不能得到一个“对象本身”数组如果它们是引用类型。谢谢,这就是我的想法。我必须习惯新的语法。在C中,我认为,是否引用“引用”(指针,也指地址)和对象(由地址指向的区域)更为明确.@MarcoBertoncin您可以认为C#中的类类型对象带有一个隐式星号。这简化了语法,但造成了一点初始混乱。@MarcoBertoncin还可以看看值类型和引用类型(这是一个好的开始)。从这个角度来看,它们有不同的行为:过分简化,值类型变量永远不会为null。Int(实际上是System.Int32 struct的别名)是值类型的第一个示例。谢谢。我理解。顺便说一句,我完全同意实现(仅在以下情况下分配引用和对象:您可能只需要少量引用和对象,这将提高内存使用率)。内存碎片如何?(我在原始文章中的第二点)@MarcoBertoncin由于C#的引用比指针略多,因为它们必须参与垃圾收集游戏,所以C#不提供API来将引用与对象放在一起。另一方面。