2009-10-21 4 views
24

Когда я начал программирование OO много лет назад, у меня сложилось впечатление, что переменные (если это правильное слово) были либо «примитивами» (int, double, и т. Д.), Либо первоклассными объектами (String, JPane и т. Д.), , Это подкрепляется недавним ответом на примитивы в Java и C# (@ Daniel Pryden: Are primitive types different in Java and C#?). Однако не знаю, являются ли C# ValueTypes примитивами, объектами или другим зверьком, например объектами второго класса. Я вижу, что SO имеет только одно использование тега first-class, поэтому, возможно, это уже не полезный термин.Что представляют собой объекты первого класса в Java и C#?

Я не нашел the Wikipedia article полезный («Эта статья нуждается в внимании от эксперта по данной теме»). Я был бы признателен за таксономию и текущее использование терминов, в первую очередь связанных с Java и C# (хотя, возможно, другие языки прольют просветление).

Разъяснение: Я хотел бы понять термин первого класса и что его диапазон использования есть.

+0

** Резюме **: после 5 ответов (30 минут) картина кажется, что нет единого мнения о «первоклассном» (за исключением того, что здесь это не очень полезно) и что различие между примитивами и объектами в C# размыт (примитивы могут иметь методы). Так что теперь я не знаю, что такое «примитив»! Но я получаю более четкое представление о том, как отличаются 'int' C# и' int' Java. –

+0

Я читал «Обучение Java» Патриком Нимейером, в котором он упоминает, что массивы являются истинными первоклассными объектами, и в этом вопросе https://stackoverflow.com/questions/245192/what-are-first-class-objects определение для заданы первоклассные объекты в python. Это верно и для java? –

ответ

7

Проблема заключается в том, что «объект первого класса» не является четко определенной концепцией.

Нормальное использование заключается в том, что кто-то говорит, что «объект» - это класс вещей, который должен иметь все свойства X, Y и Z. Но есть и другие вещи, которые не имеют всех этих свойств , но они являются своего рода объектно-иш. Таким образом, мы будем называть прежние объекты «первого класса», а остальные не «первым классом» ... и могут быть не объектами.

Проблема заключается в том, что существует некоторое количество видов свойств, которые должна иметь вещь, чтобы сделать объект «первым классом». И нет перспективы для людей с противоположными взглядами прийти к консенсусу. (Например, эксперт по языку Javascript может усиленно заявлять, что объект является только первым классом, если он основан на шаблонах.)

Единственными действительно прочными представлениями о «первоклассности» будут те, которые вы можете получить из соответствующие спецификации языка для Java и C#. И они действительно применяются только в рамках соответствующих языков/типов систем ... и не на нескольких языках.

Таким образом, «объект класса Java первого класса» или «объект класса C# первого класса» может иметь смысл, но «объект первого класса», извлеченный из контекста, не является.

Ну это мое мнение ...

+0

Спасибо - это тот ответ, который я искал. –

3

Для каждого примитивного типа данных в Java основная библиотека классов предоставляет класс-оболочку, который представляет его как объект Java. Например, класс Int32 обертывает тип данных int, а Double-класс обертывает двойной тип данных.

С другой стороны, все примитивные типы данных в C# являются объектами в пространстве имен System. Для каждого типа данных предоставляется краткое имя или псевдоним. Например, int - это краткое имя System.Int32, а double - краткая форма System.Double.

Список типов данных C# и их псевдонимов приведен в следующей таблице. Как вы можете видеть, первые восемь из них соответствуют примитивным типам, доступным на Java. Обратите внимание, однако, что логическое имя Java называется bool в C#.

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

+0

Обратите внимание, что вы говорите, что «примитивные типы данных в C# являются объектами» - если это правильное использование, оно размывает различие между примитивным и объектным, –

+1

Ну, я не говорю, это то, что написано на MSDN, пожалуйста, перейдите по ссылке Я предусмотрел выше. – Tarik

0

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

другими словами C# методы являются первым объектом класса, потому что мы можем передать его в другом методе. мы можем использовать такие методы, как любые другие значения (строки, числа, пользовательский объект).

Другой пример первых объектов класса, что и может найти редкость на других языках, но с # это выражения

+0

Методы на C# являются * не * первоклассными объектами. Однако они могут быть * подняты * на объекты посредством использования делегатов или явных оберток. – 2009-10-21 22:11:23

+0

(Python и Javascript - это языки, которые имеют методы как первоклассные граждане). – 2009-10-21 22:12:39

+0

методы не первоклассные в клар. но в C# они первоклассны из-за синтаксиса. независимо от того, что будет сделано компилятором или временем выполнения, мы говорим здесь о языках. imho :-) –

5

В .NET у вас нет примитивных типов против классов. Вместо этого у вас есть структуры против классов, но структуры разделяют многие функции классов (например, способность иметь свойства и методы) и наследуют от класса Object.

Когда вы пишете, например, int в C#, это просто ярлык языка для структуры Int32. Вы можете сделать, например, int i=int.Parse("34"), или даже string s=1234.ToString(). Чтобы назначить экземпляры структур переменным типа Object, существует the boxing/unboxing mechanism.

В Java, с другой стороны, у вас действительно есть примитивные типы и классы по дикотомии. Так, например, для выполнения операций с переменной типа int, вы должны использовать дополнительный класс Integer. Это одна из вещей, которые мне не нравятся в Java по сравнению с .NET.

EDIT. Когда вы читаете о «объектах первого класса» (или классах), это означает «полностью задействованные объекты», то есть классы, которые имеют те же возможности, что и любые другие системные классы или пользовательские классы. Это значит отличать от «ограниченных примитивных типов».

+0

Интересно, почему это проголосовало, 'int' не' Int32', а один тип значения, другой класс. – Blindy

+6

@Blindy, фактически оба они являются типами значений. int - это быстрое представление 'Int32'.Это все – Tarik

+0

P.s: для получения дополнительной информации: http://tinyurl.com/yguowkt, как 'int', так и' Int32' являются типами значений и хранятся в стеке. – Tarik

1

Честно говоря, я понятия не имею, что такое «первого класса объект» ...
Но я первым нашел применение подобной идиомы в Lua документации и рассылки список, говорящий, что функции являются первоклассными гражданами или первоклассными ценностями.

Я позволяю один из авторов Lua, чтобы объяснить, что это такое: Programming in Lua : 6 - More about Functions

Это означает, что в Lua, функция является значение с теми же правами, как и обычных значений, таких как числа и строки. Функции могут быть сохранены в переменных (как глобальных, так и локальных) и в таблицах, могут передаваться как аргументы, и могут быть возвращены другими функциями .

Каким-то образом, это определение применимо к объектам в Java: вы можете хранить их в переменных, в массивах, использовать их в качестве параметров функции и возвращать их, использовать в качестве ключа для HashMap и других коллекций и т.д.
Не конечно, если это то, как этот термин используется для объектов, но по крайней мере он имеет смысл ... :-)

На языке, таком как C, объекты должны быть сделаны с нуля, используя некоторые трюки (воссоздание C++, как-то ...), поэтому они не первоклассны: вам нужно пропустить указатели, чтобы манипулировать ими.

+0

Правильно, функции - хороший пример: First-Class означает здесь «вы можете сохранить их в списке». Вы не можете хранить ints в списке Java (по крайней мере, вы не могли в более ранних версиях, потому что int не является объектом - теперь вы можете, но есть какая-то магия). –

1

Когда мы говорим о «объектах первого класса» под «объектами», мы подразумеваем некоторые понятия языка, а не объекты, которые мы создаем на этом языке. Вот почему есть такие термины, как «первоклассные граждане».

Так, например, Java имеет следующие понятия - Java-объекты, Java-примитивы, поля, методы и другие (по объектам Java я имею в виду все, что является экземпляром типа Object). Я бы сказал, что на Java Java-объекты и Java-примитивы являются первоклассными гражданами на этом языке.

В C# у нас есть некоторые дополнительные понятия, которые мы можем «протестировать» для первоклассных свойств. Например, делегаты. Мы можем назначить делегат ot переменной (дать имя), передать его методу в качестве аргумента, вернуть его из метода, включить в структуры данных (например, использовать словарь делегатов). Поэтому я думаю, что мы можем сказать, что делегаты являются первоклассными объектами в C#. Вы можете продолжить и другие концепции C# - события, свойства ...

Функциональные языки имеют понятие «функция» и, конечно же, это первоклассный гражданин на любом функциональном языке. Я бы сказал, что мы можем назвать язык функциональным языком, если он имеет «функцию» как первоклассную концепцию (имя, пропуск, возврат, включение ...).

Итак, если какой-то язык приносит некоторые понятия, мы можем «измерить» силу этих понятий на языке, который он сам.

+0

На самом деле, я не учитывал свойство быть способным создавать объект во время выполнения. Поэтому с этой точки зрения dalagates не являются первоклассными объектами в C#. –

39

Понятие "first-class citizen" or "first-class element" на языке программирования было введено британским компьютерным ученым Christopher Strachey в 1960-х годах в контексте первоклассных функций. Самая известная формулировка этого принципа, вероятно, в Structure and Interpretation of Computer Programs Джеральд Джей Зуссмана и Гарри Абельсоном:

  • Они могут быть названы переменными.
  • Они могут передаваться в качестве аргументов в процедуры.
  • Они могут быть возвращены в качестве результатов процедур.
  • Они могут быть включены в структуры данных.

В принципе, это означает, что вы можете сделать с этим элементом языка программирования все, что вы можете сделать со всеми другими элементами на языке программирования.

+0

Разве это не означает, что целые числа ('1',' 2' ..) также являются первоклассными гражданами? –

-1

Объекты первого класса - это те объекты, которые мы создаем без использования «нового» ключевого слова. Обычно мы создаем объекты, используя ключевое слово 'new', но некоторый объект в языке программирования, который мы создаем, не используя ключевое слово 'new'.

В java 'String' - объект первого класса. Это концепция Java, и она не является концепцией stander для всех языков программирования.

Смежные вопросы