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?
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?
Antworten:
Variablen in C # sind in 1 von 2 Gruppen. Werttypen oder Referenztypen . Typen wie int
und DateTime
sind 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 .
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 .
Alle Variablen erhalten an dem Punkt, an dem die Variable deklariert wird, immer einen Anfangswert . Somit werden alle Variablen initialisiert .
Für Werttypen gibt int
der 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.MinValue
standardmäß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 .
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.
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:
MyClass myClassyReference
new MyClass()
=
.Wiederholung der Fakten:
Eine Referenztypvariable wird auch einfach als "Referenz" bezeichnet. Eine "Werttypvariable" ist keine Referenz.
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.
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
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 .
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 obj
Variablen 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 obj
Variable 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.Object
Object
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();
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 SqlConnection
Objekt und initialisiert die conn
Variable, 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.)
Instanziiert bedeutet, dass eine Instanz des Objekts erstellt wurde. Initiiert bedeutet, dass dasselbe Objekt eine Initialisierung durchgeführt hat.
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.
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.
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."
Wir können es so sehen. Für eine Codezeile unten:
var p = new Person();
Die obige Zeile kann auf zwei Arten gelesen werden:
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 .
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 new
ist ein Schlüsselwort, das Speicher für eine Instanz zuweist und conn
ein Variablenname ist, der dieser Instanz zugewiesen wird.
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 new
Schlü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.