当试图在C#中做一些相当先进的事情时(比如某种黑客),提出了"头等"的概念.
例如,一个方法是第一类编程构造,因为你可以用它做xyz(xyz不是方法所做的,但是一般的方法给你什么,我不记得xyz现在是什么),但是. NET 1.1委托无法传递给方法,因为它们不是一流的编程结构(我读过这些内容).
什么是一流的编程结构?
谢谢
英国计算机科学家Christopher Strachey在20世纪60年代在一流功能的背景下介绍了编程语言中的"一等公民"或"一等元素"的概念.这个原则最着名的表述可能是Gerald Jay Sussman和Harry Abelson 的计算机程序结构和解释:
它们可以用变量命名.
它们可以作为参数传递给程序.
它们可能会作为程序结果返回.
它们可能包含在数据结构中.
基本上,这意味着您可以使用此编程语言元素完成您可以使用编程语言中的所有其他元素执行的所有操作.
我怀疑你找不到正式的定义 显然JörgWMittag找到了一个 :)
鉴于正式的定义,我的答案的其余部分仅仅是我当时对它的理解.当然,每个使用术语"一流结构"的人是否意味着完全相同的事情是另一回事.
确定某些东西是否是"第一类"构造的方法是问自己这样的事情:
该功能是否得到支持并与语言的其余部分完全集成,或者是否存在许多不必要的限制,这些限制给人的印象是它只是"用螺栓固定"可能只解决 一个特定的用例而不考虑构造的其他区域如果它更完全是"语言的一部分",它真的很有用吗?
如你所见,这是一个明确的灰色区域:)
实际上,C#中的代表就是一个很好的例子.在C#1,你可以通过委托进入方法,并有大量的方法,使他们都很好地融入语言(之类的东西转换为可用的,事件处理,+ =和- =翻译成Delegate.Combine /删除).我会说他们是一流的结构.但是,这与委托从C#2和3中获得巨大收益的事实并不矛盾,这些方法包括匿名方法,隐式方法组转换,lambda表达式和协方差.他们现在可以说更像是一流的建筑......尽管我会说他们在C#1中是"头等舱"但我可以理解为什么有人可能不同意.
也许会有类似的情况IEnumerable
.在C#1.0中,它得到了支持,foreach
但是foreach
循环不会IEnumerator
在最后处理它.这部分是在C#1.2中修复的,但仍然只有语言支持消费 IEnumerable
s,而不是创建它们.C#2.0提供了迭代器块,这使得它实现起来很简单IEnumerable
(及其通用等价物).这是否意味着可迭代序列的概念不是C#1.0中的"第一类"构造?有争议的,基本上......
什么是一流的编程结构?
如果语言以类似于其他类型的对象的方式支持它,那么某些东西就是第一类构造.
例如,在C++中,函数不会被视为第一类构造:您可以在运行时创建其他类型的对象,但不能实例化新函数.相比之下,在C#3及更高版本中,函数可能会被认为是引入lambda/anonymous函数的第一类构造.
与许多其他事物一样,这自然是主观定义.对于更具体的例子,维基百科有一个很好的总结,就像C2一样.