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

Немного оффтоп, но есть более эффективный способ создания строк с префиксом длины, чем тот, который вы описываете. Создайте структуру наподобие этой (действительной в C99 и выше):

struct String 
{
  size_t length;
  char characters[0];
}

Это создает структуру, которая имеет длину в начале, с элементом 'characters', используемым как char *, так же, как с ваша текущая структура. Разница, однако, заключается в том, что для каждой строки можно выделить только один элемент в куче вместо двух. Распределите ваши строки следующим образом:

mystr = malloc(sizeof(String) + strlen(cstring))

Например, длина структуры (которая является просто size_t) плюс достаточно места, чтобы поставить после нее фактическую строку.

Если вы не хотите использовать C99, вы также можете сделать это с помощью «символов символов [1]» и вычесть 1 из длины строки для выделения.

29
задан Community 23 May 2017 в 12:02
поделиться

7 ответов

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

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

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

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

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

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

10
ответ дан 28 November 2019 в 01:11
поделиться

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

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

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

46
ответ дан 28 November 2019 в 01:11
поделиться

When we're talking about "first-class objects" by "objects" we mean some concepts of the language, not the objects that we create in that language. That is why there is also such terms like "first-class citizens".

So, for example, Java has following concepts - Java-objects, Java-primitives, fields, methods and other (by Java-objects I mean anything that is instance of Object type). I'd say that in Java both Java-objects and Java-primitives are first-class citizens in the language.

In C# we have some additional concepts that we can "test" for first-class properties. For example, delegates. We can assign delegate ot variable (give a name), pass it to the method as an argument, return it from method, incorporate in data structures (have a Dictionary of delegates for example). So I think we can say that delegates are first-class objects in C#. You can continue for other concepts of C# - events, properties...

Functional languages have concept of "function" and of course it is a first-class citizen in the any functional language. I'd say that we can call language a functional language if it has "function" as a first-class concept (name, pass, return, incorporate...).

So, if some language bring some concepts we can "measure" the power of this concepts in the language it self.

1
ответ дан 28 November 2019 в 01:11
поделиться

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

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

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

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

5
ответ дан 28 November 2019 в 01:11
поделиться

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

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

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

1
ответ дан 28 November 2019 в 01:11
поделиться

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

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

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

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

3
ответ дан 28 November 2019 в 01:11
поделиться

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

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

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

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

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

1
ответ дан 28 November 2019 в 01:11
поделиться