c #: Unterschied zwischen "System.Object" und "Objekt"

73

Gibt es in C # einen Unterschied zwischen der Verwendung System.Objectin Code und nicht nur objectoder System.Stringeher als stringund so weiter? Oder ist es nur eine Frage des Stils?

Gibt es einen Grund, warum eine Form der anderen vorzuziehen ist?

Paolo Tedesco
quelle
5
So mache ich das: Ich verwende int oder string im Kontext einer primitiven Variablen (wie int x = 0) und verwende Int32 und String usw. im Kontext von Klassen (wie Int32.Parse oder String.Empty) - nicht Es macht jedoch keinen Unterschied, am Ende wird es mit demselben CLR-Typ kompiliert.
Tamas Czinege
2
Warum postest du das nicht als Antwort?
Paolo Tedesco
1
Dies ist eine ähnliche Frage wie bei diesem one-stackoverflow.com/questions/981434/…
RichardOD

Antworten:

70

stringist ein Alias ​​für global::System.String. Es ist einfach syntaktischer Zucker. Die beiden sind in fast allen Fällen genau austauschbar, und es gibt keinen Unterschied im kompilierten Code.

Persönlich verwende ich die Aliase für Variablennamen usw., aber ich verwende die CLR-Typnamen für Namen in APIs, zum Beispiel:

public int ReadInt32() // Good, language-neutral

public int ReadInt() // Bad, assumes C# meaning of "int"

(Beachten Sie, dass der Rückgabetyp nicht wirklich ein Name ist - er ist in den Metadaten als Typ codiert, sodass dort keine Verwirrung entsteht.)

Die einzigen Orte, an denen ich weiß, wo einer verwendet werden kann und der andere nicht (die mir bekannt sind), sind:

  • nameof verbietet die Verwendung von Aliasen
  • Bei der Angabe eines zugrunde liegenden Enum-Basis-Typs können nur die Aliase verwendet werden
Jon Skeet
quelle
10
Die Bemerkung zur Sprachneutralität für öffentliche APIs ist in der Tat sehr interessant!
Paolo Tedesco
3
Es lohnt sich, dies zu tun, um FxCop zum Schweigen zu bringen
Patrick McDonald
1
Die Sprachneutralität für öffentliche APIs gibt an, wie viel der .NET-Bibliotheken funktionieren.
Yfeldblum
1
@Stilgar Ich bezog mich nicht auf String. Schauen Sie sich meinen Kommentar zu Jons Antwort hier an, wenn es keinen Sinn ergibt
stackoverflow.com/questions/981434/…
2
@Stilgar: Deshalb habe meine Antwort int / Int32 anstelle von string / String verwendet. Ja, es spielt keine Rolle für String / Object / Decimal / Double / Byte / SByte - aber es spielt für alle anderen eine Rolle.
Jon Skeet
8

Der Objekttyp ist ein Alias ​​für System.Object . Der Objekttyp wird verwendet und als Schlüsselwort angezeigt. Ich denke, es hat etwas mit Vermächtnis zu tun, aber das ist nur eine wilde Vermutung.

Auf dieser MSDN- Seite finden Sie alle Details.

Ich bevorzuge die Verwendung der Versionen in Kleinbuchstaben, aber ohne besondere Gründe. Nur weil die Syntaxhervorhebung bei diesen "grundlegenden" Typen unterschiedlich ist und ich beim Tippen nicht die Umschalttaste verwenden muss ...

Sorskoot
quelle
6

Einer ist ein Alias ​​für den anderen. Es liegt am Stil.

Johnno Nolan
quelle
3

stringist ein Alias ​​für global::System.Stringund objectfürglobal::System.Object

Vorausgesetzt, Sie haben using System;in Ihrer Klasse String/ stringund Object/ objectsind funktional identisch und die Verwendung ist eine Frage des Stils.

(BEARBEITEN: leicht irreführendes Zitat gemäß Jon Skeets Kommentar entfernt)

Colin Pickard
quelle
3
"String" mit einem Großbuchstaben hat für den C # -Compiler oder die C # -Sprache keine Bedeutung. "string" entspricht immer global :: System.String. Ich weiß nicht, woher der ursprüngliche Autor die Vorstellung hat, dass "String" eine besondere Bedeutung hat.
Jon Skeet
1

string(mit dem Kleinbuchstaben "s") ist der Zeichenfolgentyp der C # -Sprache und der Typ System.Stringist die Implementierung stringin .NET Framework.

In der Praxis gibt es keinen Unterschied zu den stilistischen.

EDIT: Da die oben genannten offensichtlich nicht klar genug waren, gibt es keinen Unterschied zwischen ihnen, sie sind vom gleichen Typ, sobald sie kompiliert wurden. Ich habe den semantischen Unterschied erklärt, den der Compiler sieht (der nur syntaktischer Zucker ist, ähnlich wie der Unterschied zwischen einer Weile und einer for-Schleife).

Matthew Scharley
quelle
-1 Das ist falsch. string und System.String sind vollständig austauschbar. Zeichenfolge ist einfach ein Alias ​​für System.String
Simon P Stevens
1
Das ist richtig und ich habe nie gesagt, dass sie anders sind. Zeichenfolge ist ein Schlüsselwort, das auf System.String verweist. Vielleicht war ich nicht klar.
Matthew Scharley
1
Eigentlich war mir sehr klar: "In der Praxis gibt es keinen Unterschied ..."
Matthew Scharley
0

Es gibt keinen Unterschied. Es gibt eine Reihe von Typen, die als primitive Datentypen bezeichnet werden und vom Compiler in dem von Ihnen erwähnten Stil bedroht werden.

Der großgeschriebene Benennungsstil ist die ISO-Benennungsregel. Es ist allgemeiner, üblich; Erzwingt ausnahmslos die gleichen Namensregeln für alle Objekte in der Quelle, die ein solcher C # -Compiler hat.

abatishchev
quelle
1
Dieser Artikel ist schlecht geschrieben, um dort das Wort "primitiv" zu verwenden. Wenn Sie sich die Dokumente für Type.IsPrimitive ansehen, sehen Sie: "Die primitiven Typen sind Boolesch, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double und Single." Beachten Sie, dass dies nicht der Fall ist String, dezimal und Objekt umfassen, aber nicht enthalten IntPtr und UIntPtr.
Jon Skeet
1
(Es verwendet auch das Wort "Objekt" ziemlich schnell und locker. Es ist ein allgemein schlecht geschriebener Artikel, IMO.)
Jon Skeet
Vielleicht wäre ein besserer Begriff "Keyword-Datentypen"?
Matthew Scharley
1
Oder der C # -Sprachenspezifikationsbegriff: Aliase.
Jon Skeet
0

Meines Wissens nach ist es eine Verknüpfung, es ist einfacher, Zeichenfolgen zu verwenden, als System.string.

Aber seien Sie vorsichtig, es gibt einen Unterschied zwischen String und String (bei c # wird zwischen Groß- und Kleinschreibung unterschieden)

Omar Abid
quelle
2
Welchen Unterschied gibt es zwischen ihnen?
Abatishchev
3
Versuchen Sie, "String" ohne "using System" zu verwenden. Direktive :)
Jon Skeet
@ Jon was bevorzugen Sie zu verwenden?
IamIC
@IanC: Ich benutze normalerweise den Alias.
Jon Skeet
0

object , int , long und bool wurden als Stützräder für Ingenieure bereitgestellt , die Schwierigkeiten hatten, sich an die Idee anzupassen, dass die Datentypen kein fester Bestandteil der Sprache waren. C # hat im Gegensatz zu den vorherigen Sprachen keine Begrenzung für die Anzahl der Datentypen, die Sie hinzufügen können. Die ' System' -Bibliothek enthält ein Starter-Kit mit nützlichen Typen wie System.Int32 , System.Boolean , System.Double , System.DateTimeund so weiter, aber Ingenieure werden ermutigt, ihre eigenen hinzuzufügen. Da Microsoft an einer schnellen Einführung ihrer neuen Sprache interessiert war, stellten sie Aliase bereit, die den Anschein erweckten, als wäre die Sprache eher "C" -ähnlich. Diese Aliase sind jedoch eine vollständig verfügbare Funktion (C # wäre eine ebenso gute Sprache, wenn Sie dies tun würden entfernte alle eingebauten Aliase, wahrscheinlich besser).

Während StyleCop die Verwendung der alten Aliase im C-Stil erzwingt, ist dies ein Fehler in einem ansonsten logischen Regelwerk. Bisher habe ich keine einzige Rechtfertigung für diese Regel (SA1121) gehört, die nicht auf einem Dogma basiert. Wenn Sie der Meinung sind, dass SA1121 logisch ist, warum gibt es dann keinen Build-Typ für datetime ?

Quarkly
quelle