2013-08-02 9 views
11

This MSDN article befasst sich mit Datentypen.Betrifft primitive Datentypen in C#

Dort heißt es:

Für jede primitive Datentypen in Java, die Kern-Klassenbibliothek bietet eine Wrapper-Klasse, die es als Java-Objekt darstellt. Beispielsweise wird der Int-Datentyp Int32-Klasse umbrochen, und die Double-Klasse umschließt den doppelten Datentyp .

Auf der anderen Seite sind alle primitiven Datentypen in C# Objekte im Systemnamespace . Für jeden Datentyp ist ein Kurzname oder Alias ​​ bereitgestellt. Zum Beispiel ist int der Kurzname für System.Int32 und double ist die Kurzform von System.Double.

Ich lief auf den Mono-Code, um die Implementierung von System.Int32 struct zu lesen.

fand ich ein paar Zeilen, die mich gezwungen haben, diese Frage zu stellen:

public const int MaxValue = 0x7fffffff; 
public const int MinValue = -2147483648; 

// This field is looked up by name in the runtime 
internal int m_value; 

Ich gehe davon aus, dass MS die Struktur in der gleichen Art und Weise umgesetzt hätte. Ist das anders als ein Wrapper? Was genau versucht die Dokumentation zu vermitteln?

Wenn MSDN ist zu glauben, System.Int32 Struct würde endlos rekursiv und für mich zumindest sehr verwirrend sein.

+0

Die eingebauten Typen haben Aliase in C# die gleiche Art ermöglicht verschieden haben Namen. Z.B. 'int' und' System.Int32'. Weitere Informationen finden Sie in der Tabelle für vordefinierte Typen (C# -Referenz) (http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx). –

Antwort

13

Ist das etwas anderes als ein Wrapper?

Es gibt keine Wrapper-Typen für die primitiven Typen in C# wie es in Java ist, und die Alias ​​int für System.Int32 ist nicht so etwas wie ein Wrapper. Es ist nur System.Int32 mit einem anderen Namen.

Die primitiven Typen in C# können boxed sein, wie sie können in Java, aber in C#, wenn sie verpackt werden sie System.Object sind eingerahmt, während in Java sie ihren Wrapper-Typen sind eingerahmt.

Was genau versucht die Dokumentation zu vermitteln?

Es gibt einen Unterschied zwischen diesen beiden ähnlichen aber verschiedenen Sprachen. Auf einen naiven Blick würde es aussehen wie diese Dinge sind die gleichen:

Java: int ->Integer

C#: int ->System.Int32

Aber das ist nicht der Fall überhaupt. In Java ist int ein primitiver Typ, und Integer ist eine Klasse, die als Wrapper für int dient, wenn int s eingerahmt werden müssen. In C# int und System.Int32 sind genau das gleiche(ein primitiver Typ).

Wenn MSDN ist zu glauben, System.Int32 Struct würde endlos rekursiv und für mich zumindest sehr verwirrend sein.

System.Int32 und int sind genau die gleiche Art in C#; int ist lediglich ein praktischer Alias ​​für System.Int32. In Java sind int und Integerdistinct. In C#, int und System.Int32 sind nicht eindeutig.

Also, sehr klar:

public const int MaxValue = 0x7fffffff; 
public const int MinValue = -2147483648; 

// This field is looked up by name in the runtime 
internal int m_value; 

kann

public const System.Int32 MaxValue = 0x7fffffff; 
public const System.Int32 MinValue = -2147483648; 

// This field is looked up by name in the runtime 
internal System.Int32 m_value; 

neu geschrieben werden, und dies ändert nichts an der Bedeutung überhaupt weil int und System.Int32 sind genau die gleiche Ding. Und dann sollten Sie sich auf diese vorherige question für die spezielle Handhabung der eingebauten Typen beziehen.

+0

Was genau ist das "int" in der Implementierung der System.Int32-Struktur? Das verwirrt mich. – msiyer

+1

Es ist genau das gleiche wie 'System.Int32'. 'int' bedeutet' System.Int32'! – jason

+1

@msiyer: IIRC, die "int" innerhalb der "System.Int32" Quellcode-Datei wird speziell behandelt/kompiliert. Es ist ein bisschen magische Suppe, um den Kern-CLR-Typ zu referenzieren/zu verwenden (das ist es, ist es aber nicht, aber ist ... es ist _speziell_) In diesem Fall ist der Quellcode von Kern-Primitivtypen auf diese Art und Weise etwas Besonderes sollte nur als Referenz verwendet werden. EDIT: Siehe http://stackoverflow.com/questions/16113850/if-int32-is-just-an-aliass-for-int-how-can-the-int32-class-use-anint –

6

Re: die rekursive Definition. Es gibt bestimmte Typen, die in die Common Language Infrastructure (CLI) integriert sind. Uns wurde gesagt:

Die integrierten CLI-Typen verfügen über entsprechende Werttypen, die in der Basisklassenbibliothek definiert sind. Sie sollen in Signaturen nur unter Verwendung ihrer speziellen Codierungen referenziert werden (d. H. Nicht den allgemeinen Werttyp TypeReference Syntax verwenden). Partition I gibt die eingebauten Typen an.

Das heißt, die int wird nicht als eine Art Verweis auf System.Int32 gespeichert werden - es auf die von der CLI bereitgestellt int sein wird. Aber das vertieft sich in die Interna der CLI/CLR. Für jeden Code, der nicht Teil der CLR/BCL ist, können int und System.Int32 auch als synonym behandelt werden.

Wenn Sie die .NET-Framework-Spezifikationen wälzen wollen, sind sie zum Download von here (I aus dem MS Partition II.pdf Dokument zitiert wurde)

+0

Ich wollte Markieren Sie dies als Antwort. Aber Jason fügte später einen Link hinzu und ich hatte keine andere Wahl. Aber danke für die Links. Das war eine Fundgrube. – msiyer

+0

@msiyer - Ich hoffe, die Kombination von Antworten ist nützlich für die Menschen in der Zukunft. Es ist eine dieser Fragen, die einfach zu beantworten scheint, bis man tatsächlich versucht, eine Antwort zu schreiben. –

Verwandte Themen