Was ist der Unterschied zwischen "instanziiert" und "initialisiert"?

104

Ich habe diese beiden Wörter in Microsoft-Tutorials für VB.NET gehört. Was ist der Unterschied zwischen diesen beiden Wörtern, wenn sie in Bezug auf Variablen verwendet werden?

l - '' '' '' - '' '' '' '' '' '' ''
quelle

Antworten:

142

Wert gegenüber Referenztypen

Variablen in C # sind in 1 von 2 Gruppen. Werttypen oder Referenztypen . Typen wie intund DateTimesind Werttypen. Im Gegensatz dazu ist jede von Ihnen erstellte Klasse ein Referenztyp . C # -Strings sind ebenfalls ein Referenztyp . Die meisten Dinge im .NET Framework sind Referenztypen .

Teile einer Variablen

Es ist die Variable Name und es ist Wert . Zwei Teile .

Der Name der Variablen ist das, was Sie deklarieren . Der Wert ist das, was Sie ihm zuweisen .

Variablen werden initialisiert

Alle Variablen erhalten an dem Punkt, an dem die Variable deklariert wird, immer einen Anfangswert . Somit werden alle Variablen initialisiert .

Für Werttypen gibt intder Compiler ihnen einen gültigen Wert, wenn Sie dies nicht explizit tun. int‚s initialisieren standardmäßig auf Null, DateTime‘ s zu initialisieren , um DateTime.MinValuestandardmäßig.

Referenztypvariablen werden für das Objekt initialisiert , das Sie ihm geben. Der Compiler weist kein Objekt (dh keinen gültigen Wert) zu, wenn Sie dies nicht tun. In diesem Fall ist der Wert null- nichts. Wir sagen also, dass die Referenz auf null initialisiert ist .

Objekte werden instanziiert

Menschen werden geboren. Objekte werden instanziiert. Ein Baby ist eine Instanz eines Menschen, ein Objekt ist eine Instanz einer Klasse.

Das Erstellen einer Instanz einer Klasse wird als Instanziierung (Ta-Da!) Bezeichnet.

So declare , initialize und instantiate kommen zusammen wie diese

MyClass myClassyReference = new MyClass();

Oben ist es falsch zu sagen "... eine Instanz eines Objekts erstellen ..."


bearbeiten - inspiriert von der Diskussion der Kommentare

Drei verschiedene Dinge passieren (oben) unter Verwendung einer unterschiedlichen Terminologie und diese Terminologie ist nicht austauschbar:

  1. Eine Referenzvariable wird deklariert - MyClass myClassyReference
  2. Ein Objekt wird instanziiert (... aus / einer bestimmten Klasse , impliziert) -new MyClass()
  3. Das Objekt ist der Variablen zugeordnet. =.

Wiederholung der Fakten:

  1. Eine Referenztypvariable wird auch einfach als "Referenz" bezeichnet. Eine "Werttypvariable" ist keine Referenz.

  2. Dies: "objectA ist eine Instanz eines Objekts" ist zutiefst falsch. Wenn ObjektA "eine Instanz von ObjektB" war, muss ObjektA sein Leben mit dem Typ von ObjektB beginnen - was auch immer das ist - und dem aktuellen Zustand - was auch immer das ist. Was ist mit dem Erstellen der Objekte D, E und F, wenn sich Objekt B ändert? Nein, nein! Es ist der konzeptionelle und technische Fall, dass "objectA eine Instanz einer Klasse ist". "Instanziierung" und "Instanz von" haben eine genaue Bedeutung - ein Objekt erhält seinen Typ, seine Definitionen und Werte von einer Klasse.

  3. MyClass myClassyReference = null Im Allgemeinen sagen wir nicht "die Variable ist null zugewiesen" und wir sagen nie "die Variable verweist auf null", nein, stattdessen sagen wir "die Variable ist null"; oder "die Variable verweist auf nichts" oder "die Referenz ist null"

Praktische Anwendung:

  • Ich drücke mit dem Finger auf Ihren Code und sage: "Diese Instanz hat eine ungültige Eigenschaft. Vielleicht schlägt die Schleife deshalb fehl. Sie müssen die Parameter während der Instanziierung überprüfen." (dh Konstruktorargumente).

  • Ich sehe das in deinem Code,

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    "Sie haben die Variable deklariert, aber nie zugewiesen. Sie ist null, verweist also nicht auf irgendetwas. Deshalb löst der Methodenaufruf eine Ausnahme aus."

Ende bearbeiten


Die unerträgliche Leichtigkeit des Seins

Der Name und der Wert einer Referenztypvariablen sind unabhängig voneinander vorhanden. Und ich meine unabhängig.

Ein instanziiertes Objekt kann einen Verweis darauf haben oder nicht.

Ein instanziiertes Objekt kann viele Verweise darauf haben.

Eine deklarierte Referenz kann auf ein Objekt verweisen oder nicht .

Radarbob
quelle
Perfekte Erklärung!
M. Fawad Surosh
Wenn es falsch ist zu sagen: "... eine Instanz eines Objekts erstellen ...", was sollten Sie sagen? "... ein Objekt instanziieren und ihm einen Verweis zuweisen ..."?
Aaron Dake
Oder wie wäre es mit: "... ein Objekt instanziieren und eine Variable mit einer Referenz davon initialisieren"? Das schließt beide Wörter ein und scheint alles zu formulieren - wenn auch auf ziemlich lange Weise. Was denken Sie?
Aaron Dake
... was solltest du sagen? Sagen Sie: "Erstellen einer Instanz einer Klasse", nicht "... eines Objekts". Und "Instanziieren einer Variablen auf eine Referenz davon" ist Doppelrede und in zweierlei Hinsicht falsch: (1) Nur Objekte werden instanziiert. (2) Eine Variable, die auf ein Objekt zeigt, ist eine Referenzvariable, oder kurz gesagt, die Variable ist die Referenz. Ich werde es anders sagen: Eine "Referenztyp" -Variable ist eine Referenz. Es bezieht sich auf ein Objekt oder zeigt auf dieses.
Radarbob
40

Eine Variable wird mit einem Wert initialisiert. Ein Objekt wird instanziiert, wenn ihm Speicher zugewiesen wird und sein Konstruktor ausgeführt wurde.

Zum Beispiel ist hier eine Variable:

Dim obj as Object

Diese Variable wurde nicht initialisiert . Sobald ich der objVariablen einen Wert zugewiesen habe , wird die Variable initialisiert. Hier einige Beispiele für die Initialisierung:

obj = 1
obj = "foo"

Die Instanziierung ist eine ganz andere Sache, hängt jedoch zusammen, da auf die Instanziierung normalerweise eine Initialisierung folgt:

Dim obj As New Object()

In der vorhergehenden Codezeile wird die objVariable mit dem Verweis auf die neue , die instanziiert wurde, initialisiert . Wir sagen, dass das Neue instanziiert wurde, weil wir eine neue Instanz davon erstellt haben.ObjectObject

Jetzt glaube ich, dass VB.NET dies viel verwirrender macht als C #, da nicht klar ist, dass eine Zuweisung im obigen Code stattfindet. In C # ist es viel klarer, dass es sowohl eine Instanziierung einer Instanz als auch eine Initialisierung einer Variablen gibt:

Object obj = new Object();
Andrew Hare
quelle
@ Andrew Objekt obj = 1; ist Initialisierung und Objekt obj = neues Objekt () / ist Instanziierung und Initialisierung Dies ist, was Sie erwähnt haben. Jetzt möchte ich Sie zwei Dinge fragen. 1. was ist das Objekt obj; ? 2. Wurde der Speicher zugewiesen, wenn ich das Objekt obj verwende? oder es wird zugewiesen, wenn ich es durch dieses Codeobjekt initialisiere obj = 1; ?
Kashif
Ich würde sagen, "Objekt obj" ist die Deklaration, und nein, Speicher wurde noch nicht zugewiesen. Oder zumindest nur genug Speicher, um den Wert "null" aufzunehmen. Der tatsächliche Speicher für die Variable wird basierend auf dem Wert zugewiesen, sobald sie initialisiert wurde.
Aaron Dake
14

Um etwas zu initialisieren, muss es auf seinen Anfangswert gesetzt werden. Etwas zu instanziieren bedeutet , eine Instanz davon zu erstellen.

Oft ist dies mehr oder weniger dasselbe. Dies:

SqlConnection conn = new SqlConnection();

Instanziiert ein SqlConnectionObjekt und initialisiert die connVariable, indem es auf diese Instanz gesetzt wird.

Da der Konstruktor eines Objekts auch die Eigenschaften des Objekts auf ihre Standardwerte setzt, ist es oft richtig zu sagen, dass das Instanziieren eines Objekts es initialisiert. (Irreführend, wenn das Objekt eine Methode verfügbar macht, die Sie explizit aufrufen müssen, um sie nach der Instanziierung zu initialisieren, wie dies manchmal der Fall ist.)

Robert Rossney
quelle
4

* Instanziierung bedeutet, eine Instanz für eine Klasse oder ein Objekt zu erstellen. Initialisierung bedeutet, * dasselbe Objekt oder dieselbe Klasse für einen beliebigen Zweck zu initiieren. **

Sona
quelle
3

Instanziiert bedeutet, dass eine Instanz des Objekts erstellt wurde. Initiiert bedeutet, dass dasselbe Objekt eine Initialisierung durchgeführt hat.

Gabriel McAdams
quelle
2

Wenn Sie eine Klasse oder ein Objekt instanziieren, erstellen Sie eine neue Instanz davon oder weisen Speicher zu, um eine zu "halten". Das Initialisieren dieses Objekts wären die Anweisungen, die während der Instanziierung ausgeführt werden.

typoneerror
quelle
2

Instanziierung ist, wenn Sie eine Instanz einer Klasse erstellen. Diese Instanz ist dann ein Objekt, und Sie können seine Eigenschaften festlegen oder Methoden darauf aufrufen (sie anweisen, Dinge zu tun).

Initiierung ist, wenn Sie eine Reihe von Anfangsbedingungen für etwas einrichten. Das etwas könnte ein Objekt sein, bei dem Sie es anweisen, sich selbst zu initiieren, oder nur eine Variable, der Sie einen Wert zuweisen.

Ein Objekt kann einige andere Dinge initialisieren oder sogar andere Objekte als Teil seiner Initiierung instanziieren.

Der Unterschied besteht darin, dass die Instanziierung die Schaffung einer Sache ist, die Dinge tun kann. Initiation ist etwas, das erledigt wird.

ChrisA
quelle
1

Siehe die Java-Dokumente: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" PunktursprungOne = neuer Punkt (23, 94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."
Jaros
quelle
1

Wir können es so sehen. Für eine Codezeile unten:

var p = new Person();

Die obige Zeile kann auf zwei Arten gelesen werden:

  1. Die Variable p wurde als Personenklasse initialisiert
  2. Die Personenklasse wurde in der Variablen p instanziiert

Das Thema Referenz oder Kontext ist wichtig. Wenn wir von Variablen sprechen , verwenden wir das Wort initialize . Wenn wir in Bezug auf Klasse / Typ sprechen , verwenden wir das Wort instanziieren .

MrClan
quelle
0

Die Instanziierung bezieht sich auf die Zuweisung von Speicher zum Erstellen einer Instanz einer Klasse, während sich die Initialisierung auf die Benennung dieser Instanz durch Zuweisen des Variablennamens zu dieser Instanz bezieht.

Z.B: SqlConnection conn = new SqlConnection();

Hier newist ein Schlüsselwort, das Speicher für eine Instanz zuweist und connein Variablenname ist, der dieser Instanz zugewiesen wird.

Rizwan
quelle
0

Andere haben den Unterschied erklärt, deshalb werde ich nicht ins Detail gehen. Es gibt jedoch Fälle, in denen die Instanziierung ein Objekt nicht ordnungsgemäß initialisiert. Wenn Sie ein Objekt instanziieren, initialisieren Sie es auch mit einigen Daten. Die Klasse / der Typ verfügt über die Initialisierungslogik, während die Instanziierungslogik normalerweise vom newSchlüsselwort ausgeführt wird (im Wesentlichen Speicherzuweisung, Referenzkopie usw.). Die Instanziierung muss jedoch nicht unbedingt zu einem gültigen Zustand für Objekte führen, wenn wir sagen können, dass das Objekt nicht initialisiert ist . Hier ist ein praktisches Beispiel, in dem ein Objekt instanziiert, aber nicht initialisiert werden kann (sorry, z. B. in C #).

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject ruft den Konstruktor nicht auf, um dort ein Objekt zu instanziieren (sondern etwas interne Magie).

Man könnte auch argumentieren, dass Werttypen nicht instanziiert, sondern nur initialisiert werden, da dabei keine neue Zuordnung erforderlich ist new.., dies jedoch der Definition der Instanziierung entspricht.

nawfal
quelle