Что такое "родной" и "буквенный" ключевые слова

Я вижу много раз, используя native и литералы "ключевые слова" в статьях С#. Что они означают?

Примеры

:

string.Empty статья:

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

С# vs Статья в Википедии Java:

Простые/примитивные типы
 Оба языка поддерживают ряд встроенных типы, которые копируются и передаются по значению, а не по ссылке. Java вызывает эти типы примитивных типов, в то время как они называются просто типы в С#. Простые/примитивные типы обычно поддерживают nativeот базовой архитектуры процессора.

Ответ 1

Из раздела спецификации С# 2.4.4:

A literal - это представление исходного кода значения.

Так, например, существуют литералы для строк и чисел:

string x = "hello";
int y = 10;

... но С# не имеет буквенного синтаксиса для дат и времени; вам нужно будет использовать:

DateTime dt = new DateTime(2011, 12, 11);

Что касается встроенной поддержки - здесь существуют разные уровни "native", но, насколько это касается С#, я обычно рассматриваю ее как поддержку типа в любом формате вывода. Например, есть инструкции IL для обработки двоичных типов с плавающей запятой (float, double), но когда компилятор С# испускает код, относящийся к значениям decimal, он должен вызывать операторы, объявленные в System.Decimal, Поэтому я считаю, что float и double имеют встроенную поддержку в IL, но decimal нет.

(Можно было бы написать компилятор С#, ориентированный на другую платформу, которая имела встроенную поддержку decimal - или которая, например, не имела встроенной поддержки для float и double. Вряд ли, но возможно.)

Затем, когда IL запускается в механизме выполнения, он будет работать поверх "реального" собственного кода - например, x86, который может иметь определенную поддержку для определенных типов. Это еще один уровень "родной". Например, если кто-то придумал новую версию IL, которая включала встроенную поддержку decimal, это не означает, что сами процессоры внезапно получили встроенную поддержку.

Ответ 2

Цитата из статьи string.Empty выглядит как классический случай комментариев кодов, выходящих из синхронизации со своим ассоциированным кодом. В комментарии говорится: "мы вызываем конструктор вместо использования литерала", но код не вызывает конструктор: он использует литерал. Мораль истории: не позволяйте вашей путанице заставлять вас думать, что вы неправильно поняли, потому что комментарий запутан.

Существует много дезинформации в отношении string.Empty, поскольку это немного странный случай. Выражение new string() == "обычно считается ложным, так как ожидается, что новый оператор создаст новый экземпляр. Но он не создает новый экземпляр, он возвращает экземпляр в первом пуле, который совпадает с" ", поэтому выражение истинно.

Я подозреваю, что "native" в "access from native" относится к собственному коду (второе значение "native", упомянутое Jon Skeet). Но если бы я был вами, я бы не потратил слишком много времени на эту статью. Это слишком касается абстрактной теории, которая в любом случае кажется неправильной.

Если вы хотите знать, является ли string.Empty более или менее эффективным, чем "", скомпилируйте две версии одной и той же функции и проверьте IL. Если ИЛ отличается, выполните некоторые тесты производительности.