Frage

Eine Diskussion heute früher führte mich zu Frage, ob nicht mein Verständnis von primtives und Literale korrekt ist.


Mein Verständnis ist, dass ein wörtlicher Typ ist speziell eine Art, die einen Wert haben kann, eine Notation einzuzusetzendes, dass sowohl Menschen als auch Compiler ohne spezifische Art Erklärungen verstehen können:

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

Mein Verständnis von Primitiven ist, dass sie im Wesentlichen der elementaren Datentypen sind, die der Compiler kann, wie int verstehen:

int age = 25;

... könnte eine wörtliche nicht-primitive, wie VB9 Unterstützung für XML-Literale. Ein nicht-reale Welt Beispiel wäre, wenn System.Drawing.Point mit Literalen zugewiesen werden:

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

Schließlich (und das ist die Frage, die mich wiederum führte die oben genannten Fragen zu stellen): Mein Verständnis ist, dass, ob ein primitive oder wörtliche ist, gibt es keine direkte Beziehung, ob es einen Wert oder Referenztyp.

Zum Beispiel System.String ist ein Referenztyp, die Literale unterstützt. Benutzerdefinierte definierte Strukturen sind zusammengesetzte Werttypen, die keine Literale unterstützen.

Ist mein Verständnis (wenn nicht meine Erklärung) richtig zum größten Teil?


Update: Vielen Dank für die guten Infos und Gespräche! Für jeden dieser finden, stellen Sie sicher, die Kommentare zu lesen sowie Antworten, gibt es einige große Erklärungen verbreiten sowie ein paar interessante Nebennoten.

btw: es ist ein Wurf-up zwischen denen Antwort wirklich verdient ist den großen grünen Scheck zu bekommen. Ich gebe es zu der leiden Downvoted Antwort, die nicht nur eine ordentliche Antwort, aber viele Klärung und Informationen im Kommentarthread enthält. Um fair zu sein gibt es nicht eine beste Antwort hier, gibt es mindestens drei:)

War es hilfreich?

Lösung

Ich denke, eine Sache, die Sie nicht erwähnt, ist Raum und Zuteilung. Primitives sind Werttypen und werden auf dem Stapel reserviert (solange sie nicht mit einem Objekt zugeordnet sind), mit Ausnahme der String-Typ, wie Sie erwähnt (der String-Klasse ordnet seinen Platz auf dem Heap).

Obwohl Objekte selbst enthalten Primitive dort Speicher befindet, wo das eigentliche Objekt zugeordnet ist, die auf dem Heap ist.

Andere dann, dass Ihre Aussage ziemlich gut geschrieben ist. Haben Sie eine konkrete Frage, die ich verpasst?)

Andere Tipps

Ich wollte nur hier eine kurze Notiz injizieren.

Die Sprache C # Spezifikation definiert klar „wörtliche“ - ein wörtliches ist eine Quellcode Darstellung eines Wertes . Literale sind Dinge wie true, 10, 5.7, 'c', "hello" und null -. Sie sind text Das stellt ein bestimmter Wert

Die Sprache C # Spezifikation verwendet das Wort „primitiv“ zweimal; es wird nie definiert und völlig vage, was es möglicherweise bedeuten könnte.

Die Sprache C # spec hat es nicht nötig, das Wort „primitiv“ zu verwenden oder zu definieren und somit keinen Gebrauch von diesem vagen Begriff machen sollte. Ich habe ein Gespräch mit Mads hat und wir haben vereinbart, dass künftige Ausgaben der Spezifikation diese Verwendung vollständig zu beseitigen umformuliert werden.

Wie andere Typsysteme Spezifikationen - die Reflexions Bibliothek, die CLI, die VES, und so weiter - definieren das Wort „primitiv“ ist natürlich zu ihnen.

Danke für die Erhebung der Frage auf.

  

Ist mein Verständnis (wenn nicht meine Erklärung) richtig zum größten Teil?

Ich bin nicht einverstanden in einem Punkt: Ein Literal ist eine Art Kompilierung Zeitkonstante (als "Hello World", 5 oder 'A'). Allerdings gibt es keinen „Literal-Typen“; die wörtliche immer ist der tatsächliche Wert.

Primitive Typen sind IMO "basic" Typen wie string, int, double, float, kurz, ...

So primitiv haben ihre Typen von Literalen mit ihnen verbunden sind.

Ja, ein wörtliches ist ein Wert im Quellcode ausgedrückt -. So während VB unterstützt Datum / Uhrzeit und XML-Literale, C # nicht

Von dem C # spec, Abschnitt 2.4.4:

  

A wörtliche ist ein Quellcode   Darstellung eines Wertes.

Wie Sie sagen, das ist in keinem Zusammenhang mit dem Werttyp vs Referenztyp -. Zeichenfolge ist in der Tat ein Referenztyp

Eine wörtliche, die noch niemand erwähnt hat es null durch die Art und Weise ...

Es ist auch in keinem Zusammenhang mit primitiven Typen - von Type.IsPrimitive :

  

Die primitiven Typen sind Boolean, Byte,   SByte, Int16, UInt16, Int32, UInt32,   Int64, UInt64, IntPtr, UIntPtr, Char,   Doppel- und Einzel.

... die C # Spezifikation eigentlich nicht die Idee eines „primitiven“ Typ definieren, aber beachten Sie, dass String oben nicht in der Liste enthalten ist.

In Bezug auf die Literale Kompilierung-Konstanten zu sein ... in C # hat jede wörtliche eine Darstellung, die direkt in die Montage gebacken werden kann; die zusätzlichen Literale in VB bedeuten, dass sie sie nicht Konstanten wie die CLR sind verstehen würde - man kann nicht ein const DateTime zum Beispiel haben -. aber sie sind immer noch Literalen

Hier eine MSDN-Seite , über die CLS sprechen, das schließt string als Urtyp:

  

Die .NET Framework-Klassenbibliothek   umfasst, die die Typen entsprechen,   primitive Datentypen, die Compiler   verwenden. Von diesen Typen sind die folgenden   CLS-kompatibel: Byte, Int16, Int32,   Int64, Single, Double, Boolean, Char,   Dezimal, IntPtr und String. Für mehr   Informationen über diese Art finden Sie in der   Tabelle von Typen in .NET Framework-Klassen   Bibliothek Übersicht.

dort nicht vergessen, besteht auch die ASP.Net Wörtliche Klasse .

EDIT: So eine Antwort auf die Frage im Titel nicht, da es keine „Primitive“ Klasse ist, die die gleiche Funktionalität zur Verfügung stellt. Dies kann als ein Bit eines intelligenten alec Reaktion angesehen werden, aber.

Ich denke, dass Ihr Verständnis meist korrekt ist. Wie winSharp93 sagte Literale sind Werte, die sie Typen haben, aber es gibt nicht so etwas wie einen „wörtlichen Typ“. Das heißt, während Sie Stringliterale haben, Strings sind kein „wörtliche Typ“. Wie Sie vielleicht erraten haben, was eine wörtliche definiert ist, dass der Wert direkt im Quellcode abgewertet wird, obwohl Ihre Anforderung, dass keine Art Bedarf festgelegt werden zu strengen scheint (zB F # hat Array Literale und kann den Typ des Arrayliteral schließen [| 1; 2; 3 |], kann aber nicht unbedingt ableiten, die Art des leeren Arrayliteral [| |]).

Leider glaube ich nicht, dass es ein gut vereinbarte Definition dessen, was eine primitive macht. Sicherlich, als Jon Skeet weist darauf hin, die CLR hat seine eigene Definition von Primitivität (Type.IsPrimitive), die Zeichenketten ausschließt. Allerdings andere seriösen Quellen string und sogar object betrachten primitive Typen zu sein innerhalb von C #. Ich ziehe diese Definition, da es eingebaut ist Unterstützung in C # für Streicher, wie die Verwendung des + Operators für Verkettung und die Verwendung von == als Wertgleichheit eher als Referenz Gleichheit, sowie die Tatsache, dass die String-Typ kann bezeichnet das kurze Formular string zu verwenden, anstatt den vollständigen Namen System.String verwenden.

nur hinzufügen, dass es eine andere Art ist, dass Unschärfen der Grenze: System.Decimal , deren Werte ausgedrückt werden als Literalen in der C # Sprache, aber das ist kein .Net Urtyp .

IMHO primitive Typen einfach als Typen definiert werden könnte, die direkt „existiert“ in jedem Basiswert Plattform / host : Wenn Sie bereits mit Assembler-Sprache gespielt haben Sie wissen, dass Sie haben Bytes, Wörter, Doppelwörter ... aber Sie haben keine Strings oder Dezimalzahlen.

Tatsächlich .Net Dezimalzahlen sind " emulierten " durch die .NET-Laufzeit und werden nicht direkt von der Hardware behandelt, die nur versteht IEEE 754 Gleitkommazahlen (float und verdoppelt die dann primitive Typen).

Durch die Erweiterung des Begriffs des Literalwerte „Wörtliche Typen“ könnte als jede Art, deren Werte in Betracht gezogen werden kann direkt in einer bestimmten Sprache ausgedrückt werden (C #, VB.Net, CIL ...) . Mit dieser Definition wörtlichen Typen wäre. alle primitiven Typen + Strings + Dezimalstellen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top