当我多年前开始OO编程时,我得到的印象是变量(如果这是正确的词)是“基元”(int,double等)或第一类对象(String,JPane等)。 )。最近关于Java和C#中的原语的回答进一步证实了这一点(@Daniel Pryden:Are primitive types different in Java and C#?)。但是不知道C#ValueTypes是基元,对象还是其他一些野兽,比如二等对象。我看到SO只使用first-class
标签,所以它可能不再是一个有用的术语。
我没有发现the Wikipedia article有用(“这篇文章需要有关该主题的专家的关注。”)。我很感激分类和当前使用的术语,主要与Java和C#相关(尽管其他语言可能会有所启发)。
澄清:我想理解一流一词以及它的使用范围。
答案 0 :(得分:43)
编程语言中"first-class citizen" or "first-class element"的概念是由英国计算机科学家Christopher Strachey在20世纪60年代在一流函数的背景下引入的。 Gerald Jay Sussman和Harry Abelson可能在Structure and Interpretation of Computer Programs中提出了这一原则的最着名的表述:
基本上,这意味着您可以使用编程语言中的所有其他元素完成所有编程语言元素。
答案 1 :(得分:7)
问题是“第一类对象”不是一个定义明确的概念。
正常用法是有人说“对象”是一类应该具有X,Y和Z所有属性的东西。但还有其他东西没有所有这些属性,但它们都是对象。因此,我们将称之为“第一类”对象,其余不是“第一类”......并且可能不是对象。
问题在于,对于要使其成为“第一类”对象所需的属性,存在任意数量的视图。没有反对意见的人有可能达成共识。 (例如,一个Javascript语言专家可能会强烈争辩说,如果一个对象是基于模板的,那么它只是第一类。)
关于“一流”的唯一真正的见解将是那些你可以从Java和C#的相应语言规范中收集到的。它们只适用于各自语言/类型系统的范围......而不是跨多种语言。
所以“第一类Java对象”或“第一类C#对象”可能是有意义的,但是脱离上下文的“第一类对象”不是。
那是我的意见......
答案 2 :(得分:5)
在.NET中,您没有原始类型与类。相反,你有结构vs类,但结构共享类的许多功能(例如具有属性和方法的能力),并且也从Object
类继承。
例如,当您在C#中编写int
时,它只是Int32
结构的语言快捷方式。您可以执行int i=int.Parse("34")
,甚至string s=1234.ToString()
。为了将结构实例分配给Object
类型的变量,有the boxing/unboxing mechanism。
另一方面,在Java中,你确实有原始类型和类别双切割术。因此,例如,要对int
类型的变量执行操作,必须使用辅助Integer
类。与.NET相比,这是我不喜欢Java的事情之一。
修改即可。当您阅读“第一类对象”(或类)时,它意味着“完全供电的对象”,即具有与任何其他系统类或用户制作的类相同功能的类。这是为了区别于“有限的原始类型”。
答案 3 :(得分: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
答案 4 :(得分:1)
http://onjava.com/onjava/2003/05/21/delegates.html
换句话说,c#方法是第一类对象,因为我们可以在另一个方法中传递它。我们可以像任何其他值一样使用方法(字符串,数字,用户创建的对象)。
你可以在其他语言中找到的第一类对象的另一个例子,但c#是表达式
答案 5 :(得分:1)
我让Lua的一位作者解释它是什么:Programming in Lua : 6 - More about Functions
这意味着,在Lua中,函数是a 具有相同权利的价值 传统的价值观,如数字和 字符串。功能可以存储在 变量(全局和本地)和 在表中,可以作为参数传递, 并且可以由其他人返回 功能
不知何故,这个定义适用于Java中的对象:您可以将它们存储在变量中,在数组中,将它们用作函数参数并返回它们,将它们用作HashMap的键和其他集合等。
不确定这个术语是如何用于对象的,但至少它是有意义的......: - )
在像C这样的语言中,对象必须从头开始,使用一些技巧(重新创建C ++,不知何故......),所以它们不是一流的:你必须传递指针来操纵它们。
答案 6 :(得分:1)
当我们用“对象”谈论“第一类对象”时,我们指的是语言的一些概念,而不是我们用该语言创建的对象。这就是为什么还有像“一等公民”这样的术语。
因此,例如,Java有以下概念 - Java对象,Java原语,字段,方法和其他(Java对象,我指的是任何Object类型的实例)。我要说在Java中,Java对象和Java原语都是该语言中的一等公民。
在C#中,我们有一些额外的概念,我们可以“测试”第一类属性。例如,代表。我们可以分配委托ot变量(给出一个名字),将它作为参数传递给方法,从方法返回它,合并到数据结构中(例如有一个委托词典)。所以我认为我们可以说委托是C#中的第一类对象。您可以继续使用C#的其他概念 - 事件,属性......
功能语言具有“功能”的概念,当然它是任何功能语言中的一等公民。我会说如果语言具有“功能”作为一流的概念(名称,传递,返回,合并......),我们可以将语言称为函数式语言。
因此,如果某种语言带来了一些概念,我们可以用自己的语言“衡量”这些概念的力量。
答案 7 :(得分:-1)
第一类对象是我们在不使用“new”关键字的情况下创建的对象。 通常我们使用'new'关键字创建对象,但我们创建的编程语言中的某些对象不使用'new'关键字。
在java中'String'是第一个类对象。它是一个java概念,它不是所有编程语言的标准概念。