Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

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

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

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

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

РЕДАКТИРОВАТЬ.Когда вы читаете о «первоклассных объектах» (или классах), это означает «полноценные объекты», то есть классы, которые имеют те же возможности, что и любые другие системные классы или классы, созданные пользователем.Это отличие от «ограниченных примитивных типов».

Для каждого примитивного типа данных в 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top