Подтвердить что ты не робот

Что такое объекты первого класса в Java и С#?

Когда я начал программировать ОО много лет назад, у меня сложилось впечатление, что переменные (если это правильное слово) были либо "примитивами" (int, double и т.д.), Либо первоклассными объектами (String, JPane и т.д.). Это подтверждается недавним ответом на примитивы в Java и С# (@Daniel Pryden: Отличаются ли типы примитивов в Java и С#?). Однако не знаю, являются ли С# ValueTypes примитивами, объектами или какими-то другими зверями, такими как объекты второго класса. Я вижу, что SO использует только один тег first-class, поэтому, возможно, он больше не является полезным термином.

Я не нашел статью в Википедии полезной ("Эта статья нуждается во внимании эксперта по этому вопросу"). Я был бы благодарен за таксономию и текущее использование терминов, в основном связанных с Java и С# (хотя, возможно, другие языки потеряют просветление).

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

4b9b3361

Ответ 1

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

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

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

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

Итак, "первый класс Java-объект" или "первый класс С# -объект" может иметь смысл, но "объект первого класса", извлеченный из контекста, не является.

Хорошо, что мое мнение...

Ответ 2

Понятие "первоклассный гражданин" или "первоклассный элемент" в языке программирования было введено британским ученым-компьютерщиком Кристофером Стрейчи в 1960-х годах в контексте первоклассного функции. Наиболее известная формулировка этого принципа, вероятно, содержится в Структуре и интерпретации компьютерных программ Джеральда Джея Суссмана и Гарри Абельсона:

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

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

Ответ 3

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

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

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

ИЗМЕНИТЬ. Когда вы читаете о "объектах первого класса" (или классах), это означает "полностью задействованные объекты", то есть классы, которые имеют те же возможности, что и любые другие системные классы или пользовательские классы. Это значит отличать от "ограниченных примитивных типов".

Ответ 4

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

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

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

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

Ответ 5

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

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

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

Ответ 6

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

Я позволю одному из авторов Lua объяснить, что это такое: Программирование в Lua: 6 - Подробнее о Функции

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

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

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

Ответ 7

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

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

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

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

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

Ответ 8

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

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