什么是Java和C#中的第一类对象?

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

我没有发现维基百科的文章有用(“这篇文章需要关于这个主题的专家的关注。”)。 我很感激分类和当前使用的术语,主要与Java和C#相关(尽管其他语言可能会有所启发)。

澄清 :我想理解一流的术语以及它的使用范围。

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

正常用法是有人说“对象”是一类应该具有所有属性X,Y和Z的东西。但是还有其他东西没有所有这些属性,但它们有点像对象十岁上下。 因此,我们将称之为“第一类”对象而其余部分不是“第一类”……并且可能不是对象。

问题在于,对于要使其成为“第一类”对象所需的属性,存在任意数量的视图。 反对意见的人没有达成共识的前景。 (例如,一个Javascript语言专家可能会强烈争辩说,如果一个对象是基于模板的,那么它只是第一类。)

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

所以“第一类Java对象”或“第一类C#对象”可能是有意义的,但是脱离上下文的“第一类对象”不是。

那是我的意见……

英国计算机科学家克里斯托弗·斯特拉奇 ( Christopher Strachey)在20世纪60年代在一流函数的背景下介绍了编程语言中的“一等公民”或“一等元素”的概念。 这个原则最着名的表述可能是Gerald Jay Sussman和Harry Abelson 的计算机程序结构和解释 :

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

基本上,这意味着您可以使用此编程语言元素完成您可以使用编程语言中的所有其他元素执行的所有操作。

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

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

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

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

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

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

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

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

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

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

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

不知何故,这个定义适用于Java中的对象:您可以将它们存储在变量中,在数组中,将它们用作函数参数并返回它们,将它们用作HashMap和其他集合的关键字等。
不确定这个术语是如何用于对象的,但至少它是有道理的…… 🙂

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

当我们用“对象”谈论“第一类对象”时,我们指的是语言的一些概念,而不是我们用该语言创建的对象。 这就是为什么还有像“一等公民”这样的术语。

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

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

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

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

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

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

你可以在其他语言中找到的第一类对象的另一个例子,但c#是表达式

第一类对象是我们在不使用“new”关键字的情况下创建的对象。 通常我们使用’new’关键字创建对象,但我们创建的编程语言中的某些对象不使用’new’关键字。

在java中’String’是第一个类对象。 它是一个java概念,它不是所有编程语言的标准概念。