【问题标题】:Primitive type and reference type objects原始类型和引用类型对象
【发布时间】:2016-03-04 01:29:49
【问题描述】:

我有一个过去试卷中的试题,我想回答:

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

目前我得到的答案是:

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

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

【问题讨论】:

  • 引用类型对象在实例化时以特定顺序引用这些原始类型。我不同意。我可以创建一个只引用其他引用类型的引用类型,它仍然是一个引用类型。
  • 原始类型是语言已赋予预定义值的对象。 不,即使引用也具有预定义值。 C# 中没有原始类型...有内置类型。 .NET 中有原始类型。见stackoverflow.com/questions/16589111/…
  • @Habib 不,CLR 中的值类型可以是用户定义的 (struct)
  • @jdphenix,是的,链接的问题与Java有关'
  • 静态关键字,当分配给一个变量**field*时,意味着这个变量只有一个实例**field** 并且分配的值适用于变量的所有引用。* 不需要变量的所有引用。。静态字段的值与类型有关。您可以在没有实例的情况下使用它。

标签: c# static primitive-types reference-type


【解决方案1】:

原始类型是语言赋予的对象 预定义值

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

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

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

【讨论】:

  • C# 没有对术语“原始类型”的定义。您似乎在发明自己的定义,或者使用该术语完全指代其他事物(也许您的意思是“内置类型”?)。
  • @Servy:hmm 我把它全部翻译成 C# 的观点并假设值类型 = 原始类型?
  • @Servy 考试题就是这么说的,那我是不是应该在回答的时候把它称为内置类型?
  • @AdamHiggins 是的,这就是考试题的内容。这不是一个明智的问题。您将如何选择回答取决于您,只要您意识到您在回答问题时使用不恰当的术语做出了不正确的陈述。
【解决方案2】:

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

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

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

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

【讨论】:

  • 当我这么说的时候,我会听起来有点愚蠢,但 CLR 是什么
  • @AdamHiggins 这是您的 C# 代码运行的虚拟机。如果你对 JVM 比较熟悉的话,这个概念是类似的。
  • 您错误地使用了术语“原始类型”;你说的是“内置类型”。
  • 引用类型不在堆上。这就像说值类型进入堆栈一样不正确。引用类型是引用。碰巧的是,在 C# 中,这些引用将始终指向堆中存在的对象。引用本身的值几乎可以在任何地方。
  • @Adam Higgins - 公共语言运行时,不——一点也不傻。
【解决方案3】:

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

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

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

因此,原始类型仅限于累加器的大小,并且可以通过本机处理器指令进行操作。 (基本数学和布尔/位移操作)。是的,它适合堆内存和堆栈,但它们本质上仍然是 8 位实体,而寄存器不是。

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

【讨论】:

  • 不解释就投反对票?你不是很运动。我认为我的回答在我写它的上下文中是建设性的、知情的和正确的。它增加了讨论,而匿名的反对票则没有。
  • 好吧——你为什么要为这个毫无根据的否决票扣我两个声望点?我已经准备好为评论辩护了——而且你通过扣我两点而不是一点,剥夺了我在任何地方发表评论的能力。我的论点是有效的——它实际上包括浮点数、单数和双数,因为它们是在 FPU 中处理的,这是一个 80 位架构。 .NET Decimal 类型不是原始类型——因此。原始类型早于 OOP 作为一个术语——在 C 语言标准中,处理器架构被称为缓解因素。
猜你喜欢
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
  • 2010-12-11
相关资源
最近更新 更多