原始类型和引用类型对象

Primitive type and reference type objects

我想回答过去一篇论文中的一道试题:

讨论编程语言上下文中原始类型、引用类型和静态类型的变量。举出合适的例子[8].

目前我的答案是:

基本类型是语言赋予预定义值的对象。这些类型包括 int、bool 和 float。引用类型对象在实例化时以特定顺序引用这些原始类型。这些的例子是字符串和数组。 static 关键字,当分配给一个变量时,意味着这个变量只有一个实例,分配的值适用于该变量的所有引用。

我对编程还很陌生,所以我不知道这是否完全正确,所以如果有人能给我一些关于如何提高分数的提示,我会得到这个问题,我将不胜感激.

您肯定走在正确的轨道上,但是您缺少一些关于这些的基本概念。此外,这 3 个并不互斥:

基本类型只是编译器为框架 Class 库或 FCL 类型定义的语法快捷方式。

引用类型是表示 class 实例的指针。它们指向的对象分配在堆上,变量的值是该对象的内存地址而不是 class 本身。

Static 根本不是一种类型,而是真正定义了字段、属性、方法和 classes 可以在何处以及何时使用。静态变量存在于 class 而不是实例。第一次访问 class 时调用静态构造函数。可以从 class 定义中调用静态方法。这解释了您在创建和销毁静态变量时看到的持久性。

A primitive type is an object which the language has given a predefined value

为什么?如前所述,甚至引用也可以具有预定义的值。对于原始(内置)类型,您可能想说这些是语言提供内置支持的类型。如果您说大多数原始类型也是 C# 中的值类型并且您可能想讨论值类型语义(例如,值类型变量直接包含值 - 而引用变量仅包含地址到内存中的某个对象)。

关于引用类型,您可能会说引用变量不直接包含值或对象——而只是对它的引用。现在您可能又想讨论引用语义。例如,如果您有两个指向同一个对象的引用变量 - 并且您从一个引用更改对象,另一个引用也可以看到更改 - 因为两个引用都指向同一个对象。值类型不是这种情况。如果您将相同的值类型对象分配给两个不同的值类型变量并更改一个变量 - 此更改在第二个值类型变量中将不可见,因为它们每个都直接保存值(例如,每个值类型都有自己的副本它被分配给的变量)。

您已经描述过的静态类型。

在我看来,这个问题的答案与 OOP 无关,而与编译器和微处理器有关。

根据我的理解,包含原始类型的所有特性的术语的最简单和最准确的定义是:

基本类型必须适合用于对其进行操作的寄存器——IOW,在 X86 系统中——累加器。

因此,原始类型受限于累加器的大小,并且可以由本机处理器指令进行操作。 (基础数学和 Boolean/bit-shifting 运算)。是的,它适合堆内存和堆栈,但它们本质上仍然是 8 位实体,而寄存器不是。

OOP 语言不为其托管内存进程使用原始类型,它们使用模仿原始类型的结构。 (即使在 .NET 中,当您使用关键字 int 时——它使用 System.Int32 来包装它。)