Что такое "родной" и "буквенный" ключевые слова
Я вижу много раз, используя 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. Если ИЛ отличается, выполните некоторые тесты производительности.