32

当我多年前开始 OO 编程时,我得到的印象是变量(如果这是正确的词)要么是“原始”(int、double 等),要么是一流的对象(String、JPane 等)。最近对 Java 和 C# 中原语的回答强化了这一点(@Daniel Pryden:Java 和 C# 中的原语类型不同吗?)。但是不知道 C# ValueTypes 是基元、对象还是其他诸如二等对象之类的野兽。我看到 SO 只有一个first-class标签的用途,所以它可能不再是一个有用的术语。

我没有发现Wikipedia 文章有用(“这篇文章需要有关该主题的专家的关注。”)。我会感谢分类法和术语的当前用法,主要与 Java 和 C# 相关(尽管其他语言可能会有所启发)。

澄清:我想了解“头等舱”一词及其使用范围。

4

7 回答 7

47

编程语言中“一等公民”或“一等元素”的概念是由英国计算机科学家Christopher Strachey在 1960 年代在一流函数的背景下引入的。这一原则最著名的表述可能是Gerald Jay Sussman 和 Harry Abelson在计算机程序的结构和解释中:

  • 它们可以由变量命名。
  • 它们可以作为参数传递给过程。
  • 它们可以作为程序的结果返回。
  • 它们可能包含在数据结构中。

基本上,这意味着你可以用这个编程语言元素做你可以用编程语言中的所有其他元素做的所有事情。

于 2009-10-21T16:41:22.503 回答
10

问题是“第一类对象”不是一个定义明确的概念。

正常用法是有人说“对象”是一类应该具有所有属性 X、Y 和 Z 的事物。但是还有其他事物不具有所有这些属性,但它们有点像客观的。所以我们将把以前的“第一类”对象称为“第一类”对象,其余的不是“第一类”……而且可能不是对象。

问题在于,要使事物成为“第一类”对象,需要有许多关于属性的视图。持反对意见的人也不可能达成共识。(例如,一个 Javascript 语言专家可能会极力争辩说,如果一个对象是基于模板的,那么它才是一等的。)

关于“一流”的唯一真正可靠的见解将是您可以从 Java 和 C# 各自的语言规范中收集到的见解。它们只适用于各自的语言/类型系统的范围内......而不是跨多种语言。

因此,“第一类 Java 对象”或“第一类 C# 对象”可能有意义,但脱离上下文的“第一类对象”则没有意义。

嗯,这就是我的看法...

于 2009-10-21T07:21:09.263 回答
5

在 .NET 中,您没有原始类型与类。相反,您有结构体与类,但结构体共享类的许多特性(例如具有属性和方法的能力),并且也从Object类继承。

例如,当您使用 C# 编写int时,它只是Int32结构的语言快捷方式。你可以做例如int i=int.Parse("34"),甚至string s=1234.ToString()。为了将结构实例分配给类型变量Object,有装箱/拆箱机制

另一方面,在 Java 中,您确实拥有原始类型与类的二分法。因此,例如要对类型的变量执行操作int,您必须使用辅助Integer类。与 .NET 相比,这是我不喜欢 Java 的地方之一。

编辑。当您阅读“一流对象”(或类)时,它的意思是“全能对象”,即与任何其他系统类或用户自定义类具有相同功能的类。这是为了区别于“有限的原始类型”。

于 2009-10-21T07:17:18.870 回答
3

对于 Java 中的每种原始数据类型,核心类库都提供了一个包装类,将其表示为 Java 对象。例如,Int32 类包装了 int 数据类型,而 Double 类包装了 double 数据类型。

另一方面,C# 中的所有原始数据类型都是 System 命名空间中的对象。对于每种数据类型,都提供了一个短名称或别名。例如,int 是 System.Int32 的简称,double 是 System.Double 的简称。

下表提供了 C# 数据类型及其别名的列表。如您所见,前八个对应于 Java 中可用的原始类型。但是请注意,Java 的布尔值在 C# 中称为 bool。

来自:http: //msdn.microsoft.com/en-us/library/ms228360%28VS.80,lightweight%29.aspx

于 2009-10-21T07:16:31.677 回答
1

http://onjava.com/onjava/2003/05/21/delegates.html

换句话说,c# 方法是第一类对象,因为我们可以在另一个方法中传递它。我们可以像使用任何其他值(字符串、数字、用户创建的对象)一样使用方法。

您可以在其他语言中发现不常见但 c# 的第一类对象的另一个示例是表达式

于 2009-10-21T07:16:37.030 回答
1

坦率地说,我不知道什么是“一等对象”……
但我首先在 Lua 文档和邮件列表中发现了一个类似的成语用法,即函数是一等公民或一等值。

我让 Lua 的一位作者来解释它是什么:在 Lua 中编程:6 - 关于函数的更多信息

这意味着,在 Lua 中,函数是与数字和字符串等常规值具有相同权限的值。函数可以存储在变量(全局和局部)和表中,可以作为参数传递,也可以由其他函数返回。

不知何故,这个定义适用于 Java 中的对象:您可以将它们存储在变量中、数组中、将它们用作函数参数并返回它们、将它们用作 HashMap 和其他集合的键等。
不确定这个术语是否是这样使用的对于对象,但至少它是有意义的...... :-)

在像 C 这样的语言中,对象必须从头开始,使用一些技巧(重新创建 C++,不知何故......),所以它们不是一流的:你必须传递指针来操作它们。

于 2009-10-21T07:29:32.787 回答
1

当我们用“对象”来谈论“第一类对象”时,我们指的是语言的一些概念,而不是我们用该语言创建的对象。所以才会有“一等公民”这样的名词。

因此,例如,Java 有以下概念——Java 对象、Java 基元、字段、方法和其他(Java 对象是指任何对象类型的实例)。我想说的是,在 Java 中,Java 对象和 Java 基元都是该语言的一等公民。

在 C# 中,我们有一些额外的概念,我们可以“测试”一等属性。例如,代表。我们可以分配委托变量(给一个名称),将它作为参数传递给方法,从方法返回它,合并到数据结构中(例如,有一个委托字典)。所以我认为我们可以说委托是 C# 中的一等对象。您可以继续了解 C# 的其他概念 - 事件、属性...

函数式语言有“函数”的概念,当然它是任何函数式语言的一等公民。我想说,如果语言具有“功能”作为一流的概念(名称、传递、返回、合并......),我们可以称它为函数式语言。

所以,如果某种语言带来了一些概念,我们可以用它自己的语言“衡量”这些概念的力量。

于 2009-10-21T08:35:28.787 回答