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

pet*_*ust 29 c# java first-class

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

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

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

Jör*_*tag 46

英国计算机科学家Christopher Strachey在20世纪60年代在一流功能的背景下介绍了编程语言中的"一等公民"或"一等元素"的概念.这个原则最着名的表述可能是Gerald Jay Sussman和Harry Abelson 的计算机程序结构和解释:

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

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


Ste*_*n C 10

问题是"第一类对象"不是一个定义明确的概念.

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

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

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

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

那是我的意见......


Kon*_*man 5

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

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

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

编辑.当您阅读"第一类对象"(或类)时,它意味着"完全供电的对象",即具有与任何其他系统类或用户制作的类相同功能的类.这是为了区别于"有限的原始类型".

  • @Blindy,实际上它们都是值类型.int是`Int32`的快速表示.就这样 (6认同)