Каково лучшее определение термина «Тип», особенно в языке C #? - PullRequest
2 голосов
/ 19 июля 2011

Это, вероятно, очень простой вопрос, но у меня путаница с определением Type .

Когда вы хотите дать определение термина Type , напримеркак Int, String или ...
Сразу же приходит на ум слово Template, но оно настолько близко к определению "Class", что теперь я хочу знать, каково именно определение термина Тип .

Is it the same as class definition!?Type == class!?

Если это так, мы знаем, что есть другие (справочные) типы в c #, которые не Class, такие как Interface и Delegate.

Правильно ли взаимозаменяемо использовать Type и Class?
Не могли бы вы дать мне исчерпывающее определение типа .
, заранее спасибо.

Ответы [ 7 ]

14 голосов
/ 19 июля 2011

Как уже отмечали другие, спецификация C # формально не определяет "тип". Спецификация C # не пытается быть ни формальным математическим описанием семантики языка, ни учебником для начинающих программистов; вы должны знать, что означают такие слова, как «тип», «значение» и т. д., прежде чем начать читать спецификацию.

Существует множество возможных определений типа с различной степенью точности. Например, спецификация ECMAScript несколько неофициально определяет тип как «набор значений», но поскольку ECMAScript имеет только девять возможных типов, ему не нужно иметь строгое обоснованное определение.

В другом ответе говорится, что тип состоит из набора значений, набора правил для работы с этими значениями и имени. Это очень распространенное рабочее определение типа, но оно сталкивается с проблемами, когда вы пытаетесь думать об этом более формально. Как называется анонимный тип? Является ли double*[][] имя типа "зубчатый двумерный массив указателей на удвоение"? У этого типа даже есть имя? Являются ли List<int> и List<System.Int32> двумя разными именами для одного типа? любой набор значений образует тип? Являются ли сами типы ценностями? Какой тип типа? И так далее. Это хорошее рабочее определение, но оно не выдерживает критики.

Как автор компилятора, я думаю о типах в C # следующим образом: тип - это классификация , которую можно применить к выражению . Выражение классифицируется как принадлежащее к определенному типу, если существует доказательство , которое показывает, как выражение может быть юридически классифицировано как этот тип в соответствии с правилами C #.

Например, предположим, что мы пытаемся определить тип выражения "1 + 2.3". Мы начинаем с разработки типа выражения «1». Правила C # дают нам это; выражение этой формы всегда классифицируется как int. Мы разрабатываем тип выражения «2.3». Опять же, правила C # говорят нам, что выражение этой формы классифицируется как «double». Какой тип всего выражения? Правила C # говорят нам, что сумма «int» и «double» классифицируется как «double». Таким образом, тип этого выражения "double".

Это то, что делает компилятор, когда выполняет анализ типов: он создает доказательства того, что определенные выражения могут быть юридически классифицированы определенным образом, или, если программа ошибочна, он говорит вам, почему он не смог создать доказательство.

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

Вы можете составить любую классификацию, которую хотите, и знаете, что только что сделали? Вы только что сделали тип. Вы можете классифицировать числа как «сумма двух простых чисел» и «не сумма двух простых чисел», а «больше четырех» и «не больше четырех». И затем вы можете объединить их вместе в типы, такие как «четные целые числа, которые больше четырех, а не сумма двух нечетных простых чисел». Легко определить, является ли любое конкретное целое число членом этого типа; до сих пор все целые числа, которые мы пробовали, были определены как , а не как члены этого типа. В настоящее время неизвестно, имеет ли этот тип какие-либо члены или нет; только то, что вы можете придумать тип, не означает, что вы знаете размер типа!

Система типов может разрешить любую возможную схему классификации.Мы могли бы написать C # так, чтобы «нечетные», «четные», «простые» и «составные» были подтипами «int».Мы могли бы написать C # так, чтобы любое свойство целых чисел, которое вы можете записать, было подтипом int!Мы этого не делаем, потому что такие системы типов возлагают огромную нагрузку на компилятор;Компиляторы, которые работают с такими системами типов, очень сложны, очень медленны и могут попасть в ситуации, когда им приходится решать невозможные задачи.Разработчики CLR и C # создали нашу систему типов так, что компилятор может (как правило) быть чрезвычайно быстрым при классификации выражений по типам.

3 голосов
/ 19 июля 2011

Нет, неправильно использовать «тип» и «класс» взаимозаменяемо.

Тип может быть любым из:

  • Класс
  • Aninterface
  • Тип делегата
  • Тип перечисления
  • Структура
  • Тип указателя
  • Тип массива (который также являетсякласс)

Насколько я вижу, спецификация C # на самом деле не "определяет" слово "тип".Даже во введении говорится, что C # имеет «унифицированную систему типов», не определяя, что такое тип.

Я подозреваю, что для большинства разработчиков даётся примеров того, что вы подразумеваете подслово «тип» проще и более коммуникативно, чем попытка дать точное определение слова.

1 голос
/ 19 июля 2011

Лучший рабочий ответ, который я могу придумать:

Тип - это набор значений, набор операций над этими значениями и имя, делающее его уникальным.

Если вы ищете глубокий ответ о том, что тип по существу является с точки зрения компьютерных наук, я не думаю, что вы найдете его в документации C #.Типы - это то, что большинство из нас успешно использует в нашей повседневной жизни, не имея точного определения.Но если вы действительно хотите знать, я думаю, вы найдете лучшие ответы в сообществе теории и языка программирования (в частности, ML и Haskell), где люди очень стараются точно формализовать то, о чем они говорят.

Запись в Википедии для Type System - хорошее место для начала.

1 голос
/ 19 июля 2011

Здесь идет ...

Тип - это все, что может быть создано (мое определение, а не MSFT).

Интерфейс может быть создан в том смысле, что должен существовать другой тип, реализующий интерфейс.

Анонимные типы - это типы, для которых нет определения класса, но они могут быть созданы.

Любой тип может наследоваться от другого (неанонимного) типа. Затем мы называем этот другой тип базовым типом.

РЕДАКТИРОВАТЬ: Как отметил Джон Скит, статические классы не могут быть созданы, поэтому мое определение не соответствует. Возможно, это должно быть «все, что может быть создано, ИЛИ статический класс» ...

1 голос
/ 19 июля 2011

Вы не должны использовать тип и класс взаимозаменяемо.

Это - интересное прочтение о типах.


Обратите внимание, что типы включают структуры, интерфейсы , делегаты , типы указателей и enum конструкции, а также классы .

0 голосов
/ 19 июля 2011

«тип» - это просто сокращение от «тип данных».Любая используемая переменная имеет некоторый тип данных, будь то так называемый «простой тип» (например, int или long) или «сложный тип», такой как struct или class.

Хотя класс всегда является типом, не каждый тип является классом.Например, int это тип, но не класс. C # имеет особенность, что для каждого простого типа есть также представляющий класс (bool => Boolean).

Вы не можете использовать класс и тип взаимозаменяемо, но в большинствебыть понятым, если вы делаете: -)

0 голосов
/ 19 июля 2011

Классы и типы не взаимозаменяемы.Класс всегда является типом, но тип не всегда является классом.Структуры и интерфейсы, например, являются типом, но не классами.

...