gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:20:25 24 4
gpt4 key购买 nike

如果这个问题已经出现,我深表歉意:我已经查看了提出的问题并进行了谷歌搜索,但没有看到任何解释。

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

int[] a = new 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)),然后使用偏移量初始化指针数组以指向刚刚 malloc 的区域,最大限度地减少内存碎片......在 C# 中有类似的东西吗?

最佳答案

与具有类实例的 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

关于C#:基本类型数组与类数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39767968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com