需要解释C#规范中的部分


11

我正在阅读C#规范。我可以在一个段上使用澄清:

C#具有统一的类型系统。所有C#类型(包括基本类型(如int和double))都从单个根对象类型继承。因此,所有类型都共享一组通用操作,并且任何类型的值都可以以一致的方式存储,传输和操作。此外,C#支持用户定义的引用类型和值类型,从而允许对象的动态分配以及轻量级结构的内联存储。

在这种情况下,“轻型结构的在线存储”是什么意思?

Answers:


11

Svick的回答很好,但我想我会补充一点。

首先,该段是有缺陷的。指针类型不继承自对象。在运行时,被称为接口类型或类型参数类型的值在运行时将是无效的引用或从对象继承的东西的真实实例,但总是让我感到奇怪的是,这些类型“从对象继承 继承是祖先成员是后代成员的属性,但是您通常不会将“ ToString”视为IEnumerable的成员。您认为它是实现IEnumerable的事物的成员。

该段也有缺陷,因为这是“原始类型”出现在规范中的唯一位置,并且它没有定义。因此,它既不必要又令人困惑,应该删除。

我希望这段可以修复一段时间。下次我看到Mads时,我会提醒他。

要解决您的特定问题:svick当然是正确的,但查看特定示例会有所帮助。当你说:

struct ColorfulInt
{
    int value;
    Color color;
    ...
}

然后创建一个数组:

ColorfulInt[] x = new ColorFulInt[100];

然后,这100种int和100种颜色的存储将存储在数组本身中。如果将ColorfulInt改为一个类,则该数组将包含100个对ColorfulInt的引用,每个引用都必须单独分配。与简单地在数组本身中分配存储权相比,单独分配这数百个元素在时间和空间上的效率要低得多。


那么,这些对象在内存抽象中的重要性就是,当您准备好操作它们时,如果它们位于一个连续的可寻址空间块中,那么更容易访问它们,那么指向谁知道哪里的指针呢?是正确的,还是我仍然缺少某些东西?
ChuckT

@ChuckT:正确。您无需支付间接的开销,并且还可以获得不错的缓存位置。
埃里克·利珀特

12

这意味着值类型将直接存储在您定义它们的位置,这使得它们与引用类型相比更加有效。

这到底是什么意思呢?如果您具有值类型的局部变量,则通常将其直接存储在堆栈中(但是有很多例外)。如果您具有值类型的字段,那么它将直接存储在封闭的类或结构中。


1
那讲得通。谢谢你为我充实,svick!
ChuckT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.