В C# условия являются “Примитивными” и “Литеральными” взаимозаменяемые?

Обсуждение ранее сегодня привело меня к вопросу, корректно ли мое понимание primtives и литералов.


Мое понимание - то, что литеральный тип является конкретно типом, который может иметь присвоенное использование значения нотации, которую и человек и компилятор могут понять без объявлений определенного типа:

var firstName = "John"; // "John" is literal

var firstName = (string)"John"; // *if* the compiler didn't understand that "John"
                                // was a literal representation of a string then I
                                // would have to direct it as such

Мое понимание примитивов - то, что они - по существу элементные типы данных, которые компилятор может понять, такие как интервал:

int age = 25;

... литерал мог быть непримитивным, таким как поддержка VB9 литералов XML. Пример нереального мира был бы то, если Система. Рисование. Точка могла быть присвоена с литералами:

Point somePoint = 2,2; // both X and Y are primitive values, however Point is a
                       // composite value comprised of two primitive values

Наконец (и это - вопрос, который в свою очередь привел меня задавать вышеупомянутые вопросы): Мое понимание - то, что, является ли тип примитивным или литеральным, нет никакого прямого отношения к тому, является ли это Значением или Ссылочным типом.

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

Мое понимание (если не мое объяснение), исправляют по большей части?


Обновление: Спасибо за большую информацию и переговоры! Любому находящему это, удостоверьтесь, что прочитали комментарии, а также ответы, существует некоторое большое распространение разъяснений вокруг, а также несколько интересных заметок на полях.

btw: это - жеребьевка, между которой ответ действительно имеет право получать большую зеленую проверку. Я даю его, к сожалению, downvoted ответ, который содержит не только достойный ответ, но и большое разъяснение и информацию в потоке комментариев. Для ярмарки нет одного лучшего ответа здесь, существуют по крайней мере три:)

12
задан STW 15 January 2010 в 02:15
поделиться

7 ответов

Наверное, вы не упомянули одну вещь - это пространство и распределение. Примитивы - это типы значений и выделяются на стеке (если они не связаны с объектом), за исключением строкового типа, о котором Вы упомянули (класс string выделяет место на куче).

Несмотря на то, что сами объекты содержат примитивы, хранилище находится там, где выделяется реальный объект, который находится на куче.

Кроме того, ваше утверждение довольно хорошо написано. У Вас есть конкретный вопрос, который я пропустил :)?

0
ответ дан 2 December 2019 в 07:02
поделиться

Является ли мое понимание (если не мое объяснение) правильно для большей части?

Я не согласен в одном моменте: Литерал является каким-то постоянным времени компиляции (как «Hello World» , 5 или 'A' ). Однако нет «буквальных типов»; Литерал всегда является фактической ценностью.

Примитивные типы являются IMO «Основные» типы, такие как строка, INT, Double, Float, короткие, ...

Так что примитивные имеют их виды литералов, связанных с ними.

3
ответ дан 2 December 2019 в 07:02
поделиться

Не забывайте там также существует ASP.NET Lealal Class .

Отредактируйте: Таким образом, ответ на вопрос в названии нет, так как нет «примитивного» класса, который обеспечивает ту же функциональность. Это можно рассматривать как немного умного ответа Alec, хотя.

0
ответ дан 2 December 2019 в 07:02
поделиться

Я думаю, что ваше понимание в основном правильно. Как сказал WinSharp93, литералы - это ценности, которые сами имеют типы, но нет такой вещи как «буквальный тип». То есть, хотя вы можете иметь строковые литералы, строки не являются «буквальным типом». Как вы уже догадались, что определяет литерал, заключается в том, что значение напрямую записано в исходном коде, хотя ваше требование о том, чтобы ни один тип не должен быть указан, кажется чрезмерно строгим (например, F # имеет литералы для массивов, и может выводить тип литерала массива [| 1; 2; 3 |] , но не может обязательно вывести тип литерала пустой массива [| |] ).

К сожалению, я не думаю, что существует хорошо согласованное - по определению того, что делает примитив. Конечно, как указывает Джон Скеть, CLR имеет свое собственное определение примитивности ( Тип. Симпатизм ), который исключает строки. Однако другие авторитетные источники считают строку и даже объект , чтобы быть примитивными типами в C #. Я предпочитаю это определение, поскольку в C # для строк, например, оператора + для конкатенации и использования == в качестве значения равенства Ссылочное равенство, а также тот факт, что тип строки можно упомянуть на использование короткой формы string , а не использовать полное имя System.String .

0
ответ дан 2 December 2019 в 07:02
поделиться

Я искал способ использовать нескрытый HTML в списке администраторов. Не уверен, что это относится к рамке сообщений, но использование allow_tags, как описано здесь, помогло мне.

http://urlencode.blogspot.com/2009/10/neat-django-admin-tricks-part-1.html

-121--2047057-

Я думал получить ServletContext () тогда использование realPath () может работать, но я не имеют ссылки на ServletContext

Да. См. раздел («»/getServletRequest.getSession () .getServletContext ()

-121--2758847-

Да, литерал - это значение, выраженное в исходном коде. В то время как VB поддерживает дату/время и XML-литералы, C # - нет.

Из спецификации C # раздел 2,4,4:

Литерал является исходным кодом представление значения.

Как вы говорите, это не связано с типом значения или типом ссылки - последовательность действительно является типом ссылки.

Литерал, о котором никто еще не упоминал null по пути...

Он также не связан с примитивными типами - от Type.IsPrimitive :

Примитивные типы являются булевыми, байтовыми, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Двойная и одиночная.

... спецификация C # фактически не определяет идею «примитивного» типа, но обратите внимание, что Последовательность отсутствует в списке выше.

В терминах литералов, являющихся константами времени компиляции... в C # каждый литерал имеет представление, которое может быть запечено непосредственно в сборке; дополнительные литералы в VB означают, что они не являются константами, как их понимает CLR - например, нельзя использовать const DateTime - но они все еще являются литералами.

3
ответ дан 2 December 2019 в 07:02
поделиться

Здесь - это страница MSDN, говорящая о CLS, которая включает в себя строку в качестве примитивного типа:

. включает в себя типы, которые соответствуют Примитивные типы данных, которые компиляторы использовать. Этих типов, следующие CLS-совместимый: байт, INT16, INT32, Int64, одиночный, двойной, логический, char, Десятичная, INTPTR и строка. Для большего Информация об этих типах см. Таблица типов в .NET Framework Class Обзор библиотеки.

1
ответ дан 2 December 2019 в 07:02
поделиться

Как отметил Welbog, элементы < a > и < div > должны быть обращены:

<div class="test">
    <a href="http://www.google.com">
        Lorem ipsum
    </a>
</div>

Затем в вашем стиле можно расширить тег < a > для заполнения всего div:

.test a {
    display: block;
    width: 100%;
    height: 100%;
}
-121--4690831-

Лучшим решением является использование отдельного Active

-121--4043469-

Я просто хотел ввести краткое примечание здесь.

Спецификация языка C # четко определяет "литерал" - литерал является представлением исходного кода значения . Литералы - это вещи типа true , 10 , 5,7 , 'c' , "hello" и null - они представляют собой текст , представляющий конкретное значение .

В спецификации языка C # слово "примитив" используется дважды; оно никогда не было определено и совершенно расплывчато относительно того, что оно может означать.

В спецификации языка C # нет необходимости использовать или определять слово "примитив" и поэтому не следует использовать этот расплывчатый термин. Я поговорил с Мадсом, и мы договорились, что будущие издания спецификации будут переработаны, чтобы полностью исключить это использование.

Как другие типы систем спецификации - библиотека отражения, CLI, VES и так далее - определяют слово "примитив", конечно, зависит от них.

Спасибо, что подняли вопрос.

15
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: