Что касается примитивных типов данных в С#

В этой статье MSDN обсуждаются типы данных.

В нем говорится:

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

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

Я перешел к Mono-коду, чтобы прочитать реализацию System.Int32 struct.

Я нашел несколько строк, которые заставили меня задать этот вопрос:

public const int MaxValue = 0x7fffffff;
public const int MinValue = -2147483648;

// This field is looked up by name in the runtime
internal int m_value;

Я предполагаю, что MS реализовала бы структуру таким же образом. Разве это не отличается от обертки? Что именно документация пытается передать?

Если MSDN следует полагать, система System.Int32 будет бесконечно рекурсивной и, по крайней мере, очень запутанной для меня.

Ответ 1

Разве это не отличается от обертки?

Нет типов обертки для примитивных типов в С#, например, в Java, а псевдоним int для System.Int32 не похож на обертку. Это просто System.Int32 под другим именем.

Примитивные типы в С# могут быть в коробке, как они могут в Java, но в С#, когда они помещены в бокс, они помещаются в квадрат в System.Object, тогда как в Java они привязаны к их типам обертки.

В чем именно заключается документация?

То, что существует разница между этими двумя похожими, но разными языками. При наивном взгляде было бы похоже, что все то же самое:

Java: intInteger

С#: intSystem.Int32

Но это совсем не так.. В Java int является примитивным типом, а Integer - это класс, который служит в качестве обертки для int, когда int должен быть помещен в бокс. В С# int и System.Int32 - это точно то же самое (примитивный тип).

Если MSDN следует полагать, система System.Int32 будет бесконечно рекурсивной и, по крайней мере, очень запутанной для меня.

System.Int32 и int являются точно такими же, как в С#; int является просто удобным псевдонимом для System.Int32. В Java int и Integer различны. В С# int и System.Int32 не различаются.

Итак, чтобы быть предельно ясным:

public const int MaxValue = 0x7fffffff;
public const int MinValue = -2147483648;

// This field is looked up by name in the runtime
internal int m_value;

можно переписать на

public const System.Int32 MaxValue = 0x7fffffff;
public const System.Int32 MinValue = -2147483648;

// This field is looked up by name in the runtime
internal System.Int32 m_value;

, и это не меняет значения вообще, потому что int и System.Int32 - это точно одно и то же. И тогда вы должны обратиться к предыдущему question для специальной обработки встроенных типов.

Ответ 2

Re: рекурсивное определение. Существуют определенные типы, встроенные в инфраструктуру Common Language (CLI). Нам говорят:

Типы встроенных CLI имеют соответствующие типы значений, определенные в Базовой библиотеке классов. Они должны быть на которые ссылаются в подписях, только с использованием их специальных кодировок (т.е. не используя общий тип оценки Синтаксис TypeReference). В разделе я указаны встроенные типы.

То есть, int не будет храниться как ссылка типа на System.Int32 - это будет int, предоставляемое CLI. Но это углубляется во внутренние области CLI/CLR. Для любого кода, который не является частью CLR/BCL, int и System.Int32 можно рассматривать как синонимы.

Если вы хотите портировать спецификации .NET framework, они загружаются из здесь (я цитировал из документа MS Partition II.pdf)