it-swarm.com.de

Ist alles in .NET ein Objekt?

Bitte helfen Sie uns, die Kontroverse zwischen "Fast" alles ist ein Objekt ( eine Antwort auf die Stapelüberlauf-Frage Gibt es als Anfänger etwas, das ich beachten sollte, bevor ich C # lerne? ). Ich dachte, dass dies der Fall ist, da alles in Visual Studio zumindest als Struktur angezeigt wird. Bitte posten Sie eine Referenz, damit es nicht zum "modernen Esel" wird ( This American Life ).

Beachten Sie, dass sich diese Frage auf C # bezieht, nicht unbedingt auf .NET, und darauf, wie die Daten unter der Haube behandelt werden (offensichtlich sind es alle Einsen und Nullen).

Hier sind die Kommentare zu "Alles ist ein Objekt":

  • Nein, das ist es nicht. - Binary Worrier
  • Ich hätte gerne ein Beispiel ... - scotty2012
  • ist nicht alles vom Basistyp Object abgeleitet? - Knistern
  • Die meisten Dinge sind Objekte ... - Omar Kooheji
  • Werttypen, Ints, Doubles, Objektreferenzen (nicht die Objekte, die sie selbst sind) usw. sind keine Objekte. Sie können "umrahmt" werden, um wie Objekte auszusehen (z. B. i.ToString ()), aber in Wirklichkeit sind sie primitive Typen. Ändern Sie den Eintrag in "Fast alles ist ein Objekt" und ich werde die Ablehnung entfernen - Binary Worrier
  • Ich schätze die Klarstellung. Ich denke, die niedrigste Ebene, mit der Sie interagieren können, z. B. ein Int, in C #, ist eine Struktur, die kein Objekt ist. - http://msdn.Microsoft.com/en-us/library/ms173109.aspx - Rizzle
  • Erbt Int32 nicht von ValueType, das von Object erbt? Wenn ja, ist ein int trotz des Verhaltens ein Objekt. - Chris Farmer
  • Nein, der Boxed Type für int erbt von ValueType, das von Object erbt. Sie sind keine Objekte im herkömmlichen Sinne, weil a) ein int kein Verweis auf ein int ist, IT IS das int. b) Ints werden nicht über den Müll gesammelt. Wenn Sie ein Int32 deklarieren, ist dieses 4 Bytes auf dem Stapel, Ende der Geschichte - Binary Worrier

Definition des Objekts: "Object" als Vererbung der Klasse System.Object vs. "object" als Instanz eines Typs vs. "object" als Referenztyp. "

48
rizzle

Das Problem hier ist, dass es sich wirklich um zwei Fragen handelt - eine Frage betrifft die Vererbung. In diesem Fall lautet die Antwort "fast alles" und die andere betrifft den Referenztyp im Vergleich zum Wertetyp/Speicher/Boxing. In diesem Fall lautet die Antwort "Nein" ".

Vererbung:

In C # gilt Folgendes:

  • Alle Werttypen, einschließlich Aufzählungen und nullfähige Typen, werden von System.Object abgeleitet. 
  • Alle Klassen-, Array- und Delegattypen werden von System.Object abgeleitet.
  • Schnittstellentypen werden nicht von System.Object abgeleitet. Sie sind alle in System.Object konvertierbar, Schnittstellen stammen jedoch nur von anderen Schnittstellentypen und System.Object ist kein Schnittstellentyp. 
  • Keine Zeigertypen leiten sich von System.Object ab und sind auch nicht direkt in System.Object konvertierbar.
  • "Open" -Typ-Parametertypen werden auch nicht von System.Object abgeleitet. Typparametertypen werden von nichts abgeleitet. Typargumente müssen nur von der effektiven Basisklasse abgeleitet werden, sie selbst werden jedoch nicht von irgendetwas "abgeleitet".

Von dem MSDN-Eintrag für System.Object :

Unterstützt alle Klassen in der .NET Framework-Klassenhierarchie und stellt Low-Level-Services für abgeleitete Klassen bereit. Dies ist die ultimative Basisklasse aller Klassen in das .NET Framework; es ist die Wurzel der Typhierarchie.

Sprachen erfordern normalerweise keine Klasse , Um die Vererbung von - Objekt zu deklarieren, da die Vererbung Implizit ist.

Da alle Klassen im .NET-Framework Von Object abgeleitet sind, ist Jede in der Object-Klasse Definierte Methode in allen Objekten im System Verfügbar. Abgeleitete Klassen können und können Einige dieser Methoden überschreiben.

Daher ist nicht jeder Typ in C # von System.Object abgeleitet. Und selbst für diese Typen müssen Sie immer noch den Unterschied zwischen Referenztypen und Werttypen beachten, da sie sehr unterschiedlich behandelt werden.

Boxen:

Wertetypen tun zwar erben von System.Object, werden jedoch im Vergleich zu Referenztypen im Speicher anders behandelt, und auch die Semantik, mit der sie durch Methoden in Ihrem Code übergeben werden, unterscheidet sich. In der Tat wird ein Wertetyp nicht als Objekt (Referenztyp) behandelt, bis Sie Ihre Anwendung explizit dazu auffordern, indem Sie sie als Referenztyp einrahmen. Weitere Informationen zum Boxen in C # finden Sie hier .

79
Daniel Schaffer

Ein wenig zu spät zur Party, aber ich fand das in einem Suchergebnis über SO und stellte fest, dass der Link unten zukünftigen Generationen helfen würde:

Eric Lippert bespricht dies sehr gründlich , mit einer viel besseren (qualifizierten) Aussage:

Sie können diesen Mythos korrigieren, indem Sie einfach "abgeleitet von" durch "ist konvertierbar in" ersetzen und Zeigertypen ignorieren: Jeder Nicht-Zeigertyp in C # kann in ein Objekt konvertiert werden.

Wenn Sie keine illustrierten Erklärungen von Leuten lesen möchten, die Programmiersprachen schreiben, heißt das, dass (Zeiger beiseite), Dinge wie Interface oder generische Parametertypdeklarationen ("T") keine Objekte sind, aber garantiert sind zur Laufzeit als Objekte behandelbar, da sie eine bestimmte Instanz haben, die ein Objekt sein wird. Andere Typen (Typ, Aufzählung, Delegat, Klassen usw.) sind alle Objekte. Einschließen von Werttypen, die wie andere Antworten besprochen werden können.

29
Matt Enright

Einige Leute hier haben eine seltsame Vorstellung davon, was ein "Objekt" in der objektorientierten Programmierung ist. Damit etwas ein Objekt sein kann, muss nicht ein Referenztyp sein oder, allgemeiner, jeder formalen Implementierung folgen.

Das bedeutet nur, dass Sie als erstklassiger Bürger in einer objektorientierten Welt daran arbeiten können. Da Sie can dies bei Werten in C # tun können (dank Autoboxing), ist alles tatsächlich ein Objekt. Bis zu einem gewissen Grad trifft dies sogar auf Funktionen zu (wohl aber nicht auf Klassen).

Ob dies in der Praxis relevant ist, ist eine andere Frage, aber dies ist ein allgemeines Problem mit OOP, das ich noch einmal bemerke. Bei der Definition von OOP ist niemand klar (ja, die meisten Menschen sind sich einig, dass dies etwas mit Polymorphismus, Vererbung und Einkapselung zu tun hat, einige setzen "Abstraktion" ein, um ein gutes Maß zu erreichen).

Aus Sicht der Verwendung wird jeder Wert in C # wie ein Objekt behandelt. Das heißt, ich mag die derzeit akzeptierte Antwort. Es bietet sowohl technisch wichtige Aspekte.

Beachten Sie, dass in anderen Zusammenhängen, z. C++, andere Aspekte werden hervorgehoben, da C++ nicht notwendigerweise objektorientiert ist und außerdem viel weniger auf Aspekte niedrigerer Ebene ausgerichtet ist. Daher macht die Unterscheidung zwischen Objekten, POD und eingebauten Grundelementen manchmal Sinn (dann wieder, manchmal nicht).

16
Konrad Rudolph

Sie sind alle werden als Objekte behandelt, sind aber nicht alle Objekte. Die Verwirrung kommt mit Autoboxing. 

Weitere Informationen finden Sie hier: http://en.wikipedia.org/wiki/Object_type

Die Abstraktion verwirrt offenbar die Menschen.

7
GEOCHET

Sie verwechseln ein Objekt mit einem Wert oder einer Referenz. Grundsätzlich ist alles ein Objekt. Ein Int ist ein Objekt, aber es ist auch ein Werttyp. Eine Klasseninstanz ist ein Objekt, aber auch ein Referenztyp.

Methoden sind keine Objekte oder Eigenschaften. Sie bearbeiten nur Objekte. Und ja, so ziemlich alles erbt von der Objektklasse.

6
BBetances

Ich dachte, dass Werttypen NICHT Objekte sind. Sie werden unterschiedlich im Speicher abgelegt, da die CLR - Wertetypen auf dem Stapel gespeichert werden und Objekte auf dem Heap gespeichert werden. Sie können Werttypen in einen Referenztyp umwandeln, damit sie wie ein Objekt wirken. Die CLR nimmt jedoch den Wert aus dem Stapel, verpackt ihn in ein Objekt und speichert ihn auf dem Heap. Das passiert, wenn Sie eine Variable "boxen". 

6
Rich

In C # (und in OOP im Allgemeinen) gibt es Typen (Klassenreferenz, Strukturwert usw.). Dies sind die Definitionen. Und das "Objekt" ist die konkrete Instanz eines bestimmten Typs.

Wenn wir die Frage also wörtlich lesen, ja, ist alles ein Objekt, wenn es instanziiert wird.

Die Verwirrung beginnt höchstwahrscheinlich mit einer schlechten Wahl des Namens der Basisklasse für alles. In .NET Dies ist die Object-Klasse.

5
Sunny Milenov

Von: Werttypen (C # -Referenz) - MSDN 3.5

Alle Werttypen werden implizit Vom System.ValueType abgeleitet.

Von: Wertetypklasse - MSDN 3.5

ValueType überschreibt die virtuellen Methoden von Object mit mehr Geeigneten Implementierungen für Wertetypen .

Von: Aufzählungsklasse - MSDN 3.5

Diese Klasse erbt von ValueType

Die Vererbungshierarchie lautet wie folgt:

  • System.Object
    • System.ValueType
      • System.Enum

      Fazit: Alles ist ein Objekt

3
Gavin Miller

Basierend auf allen Büchern, die ich lese, ist alles in C # ein Objekt.

Einige sind Verweise andere sind Werttyp. Werttypobjekt erbt von der Klasse ValueType . Sie haben ein anderes Verhalten, aber inhärent ... Objekte.

Aus diesem Grund können Sie ein Int32 in einer Objektvariablen sowie alles speichern, was Sie jemals in .NET erstellen können.

Weitere Informationen finden Sie unter: http://msdn.Microsoft.com/en-us/library/s1ax56ch(VS.71).aspx

Alle Werttypen werden implizit Von der Object-Klasse abgeleitet.

3
Maxime Rouiller

Während sich jeder auf die Wertetypen vs. Referenztyp-Debatte zu konzentrieren scheint, vergessen wir einen Typ in C #, der weder eine Referenz noch ein Wert ist, er leitet sich nicht von einem Objekt ab und kann nicht in ein Objekt umgewandelt werden: Zeiger

Im Gegensatz zu Werten und Referenztypen können Zeiger nicht in ein Objekt umgewandelt werden.

Gemäß der MSDN-Dokumentation zu C # -Pointer-Typen ,

Zeigertypen erben nicht vom - Objekt und es gibt keine Konvertierungen Zwischen Zeigertypen und Objekt. Auch unterstützen Boxen und Unboxing Keine Zeiger. Sie können jedoch Zwischen verschiedenen Zeigertypen Und zwischen Zeigertypen und Integraltypen konvertieren.

Hängt davon ab, was Sie mit "alles" meinen und "ist ein Objekt". Wenn Sie diese beiden Begriffe definieren, ist die Antwort einfach :-)

In einigen Sprachen ist beispielsweise ein if-Block ein Objekt, das als Wert übergeben, einer Variablen usw. zugewiesen werden kann. Dies ist in C # nicht der Fall, daher ist offensichtlich nicht alles ein Objekt in C #.

2
JacquesB

Werttypen sind keine Objekte, sie gehorchen unterschiedlichen Kopiersemantiken, anderen Passingsemantiken und müssen in eine Klasse (Object) eingeschlossen werden, um als solche behandelt zu werden.

Edit: Ich denke, das Argument ist etwas vage, da Sie das, was Sie mit 'Objekt' meinen, einschränken müssen. Ist ein Objekt nur etwas, das von Object erbt, oder gehorcht es der Verwendung der Semantik von Object? Oder sprechen wir über die allgemeinste Definition eines Objekts, bei der Daten und Operationen für diese Daten enthalten sein können?

0
Ron Warholic

Die Nummer 2 ist kein Objekt.

0
Joe Phillips

In Anbetracht dessen, dass sich die Frage auf ein Objekt im Sinne von OOP bezieht, lautet die Antwort:

Aus einem technischen Gesichtspunkt lautet die Antwort: Nein

Aus einer dogmatischen Sicht ist die Antwort: Ja

Erläuterung:

Technisch Werttypen (Grundelemente oder Strukturen) sind keine Objekte, es sei denn, sie sind in "Boxed" -Form, sondern weil das .Net nahtlose Konvertierung von Wertetypen in ihr Gegenstück "Object" durch Boxing/Unboxing vornimmt (Erstellen einer Klasseninstanz, die den Wert und enthält wird von Object abgeleitet) bedeutet, dass Werttypen sowohl als Objekte als auch als einfache Werte behandelt werden können.

Werttypen sind also in der Natur dual und verhalten sich als Werte und als Objekte . Werte in .Net sind Objekte, wenn sie sein müssen, und sie sind in den übrigen Fällen keine Objekte.

Die richtige Antwort, die den technischen Aspekt berücksichtigt, lautet "Alles in .Net ist als ob es ein Objekt" wäre.

Die dogmatische Antwort lautet: "Alles ist ein Objekt".

0
Pop Catalin

Dies ist eine Diskussion über zwei Welten: Sprache und Erinnerung.

Sprache ist für mich wie eine Abstraktionsebene und der Begriff Objekt gehört zu dieser Abstraktionsebene. Ich sehe keinen Sinn darin, über Objekte in Bezug auf die Speicherorganisation zu sprechen, und wenn Sie den Begriff "Objekt" verwenden, wenn Sie über Gedächtnis sprechen, entlehnen Sie diesen Begriff tatsächlich von einer anderen Abstraktionsebene. Sie sollten also nicht vergessen, woher es kam.

Wenn wir über C # sprechen, kann ich nicht verstehen, warum jemand die Speicherorganisation als Argument benutzt. Wenn ich diese Frage jemandem beantworten würde, würde ich natürlich sagen: "Ja, in C # ist alles ein Objekt, aber Sie sollten auch wissen, dass es unter der Haube je nach Funktion anders funktionieren kann."

Dies kann ein interessantes Argument auslösen, spricht aber auch mit einigen: In einer ähnlichen Diskussion könnte man sagen, dass es eigentlich keine objektorientierte Programmierung gibt, es gibt nur prozedurale Programmierung. Versteht deine CPU Objekte? Noch besser, eigentlich gibt es keine Software, es gibt nur verschiedene Hardware-Zustände :)

Mein Punkt ist, dass einige Begriffe nicht in andere Abstraktionsebenen übersetzt werden, und Sie sollten die Diskussion dort halten, wo sie hingehört (was in diesem Fall eine Sprache ist, keine Erinnerung).

Sogar der Autor dieser Frage stellte fest: "Beachten Sie, dass sich diese Frage auf C # bezieht und nicht unbedingt auf .NET und wie es mit den Daten unter der Haube (offensichtlich sind es alle Einsen und Nullen) behandelt."

0
Piotr Owsiak

C # hat wurde als einheitliches Typsystem bezeichnet. Das bedeutet, dass alles als Objekt gesehen werden kann. Darunter befinden sich jedoch zwei verschiedene Typen: Werttypen und Referenztypen. Werttypen können über den Boxmechanismus als Objekt betrachtet werden. Dies bedeutet, dass ein Objekt erstellt wird, das den Wert des fraglichen Werttyps darstellt. 

0
Brian Rasmussen

Auf die Semantik eingehen, Warum das Wort "Objekt" so überladen, dass es "Referenztyp" bedeutet, wenn bereits ein vollkommen guter, eindeutiger Begriff für den -> "Referenztyp" vorhanden ist und wann, indem das Wort "Objekt" überladen wird Auf diese Weise schaffen wir die Verwirrung, die dieser Thread demonstriert ... dh die Nichtübereinstimmung zwischen der Tatsache, dass alle Typen (einschließlich Werttypen) die im Typ "System.Object" definierte Implementierung erben. Natürlich ist dies im besten Fall unnötig und im schlimmsten Fall äußerst verwirrend. Selbst die Tatsache, dass die MS-Dokumentation zu diesem Thema manchmal verwirrend ist, ist keine Entschuldigung, um die Verwirrung zu verbreiten.

Viel einfacher und übersichtlicher ist es, einfach den Begriff "Objekt" zu definieren und zu verwenden, um eine Instanz eines ANY-Typs, eines Werts oder einer Referenz zu bedeuten, und den Ausdruck "Referenztyp", um die Typen zu beschreiben, die Zeigervariablen verwenden und deren Zustand gespeichert ist der Haufen ... 

0
Charles Bretana