Ho sentito queste due parole usate nei tutorial Microsoft per VB.NET. Qual è la differenza tra queste due parole se usate in riferimento a variabili?
Ho sentito queste due parole usate nei tutorial Microsoft per VB.NET. Qual è la differenza tra queste due parole se usate in riferimento a variabili?
Risposte:
Le variabili in C # sono in 1 di 2 gruppi. Tipi di valore o tipi di riferimento . Tipi come int
e DateTime
sono tipi di valore . Al contrario, qualsiasi classe che crei è un tipo di riferimento . Anche le stringhe C # sono un tipo di riferimento . La maggior parte delle cose nel framework .NET sono tipi di riferimento .
C'è il nome della variabile e il suo valore . Due parti .
Il nome della variabile è quello che dichiari che sia. Il valore è ciò che gli assegni .
A tutte le variabili viene sempre assegnato un valore iniziale nel punto in cui viene dichiarata la variabile . Quindi tutte le variabili vengono inizializzate .
Per i tipi di valore , come int
il compilatore darà loro un valore valido se non lo fai esplicitamente. int
è inizializzato a zero per impostazione predefinita, DateTime
è inizializzato a DateTime.MinValue
per impostazione predefinita.
Le variabili del tipo di riferimento vengono inizializzate sull'oggetto che gli dai. In caso contrario, il compilatore non assegnerà un oggetto (cioè un valore valido). In questo caso il valore è null
- niente. Quindi diciamo che il riferimento è inizializzato a null.
Gli esseri umani sono nati. Gli oggetti vengono istanziati. Un bambino è un'istanza di un umano, un oggetto è un'istanza di una classe.
L'atto di creare un'istanza di una classe è chiamato istanziazione (Ta-Da!)
MyClass myClassyReference = new MyClass();
In quanto sopra, è sbagliato dire "... creazione di un'istanza di un oggetto ..."
modifica - ispirato dalla discussione dei commenti
Tre cose distinte stanno accadendo (sopra) usando una terminologia distinta e quella terminologia non è intercambiabile:
MyClass myClassyReference
new MyClass()
=
.Riaffermando i fatti:
Una variabile di tipo riferimento è anche chiamata semplicemente "un riferimento". Una "variabile di tipo valore" non è un riferimento.
Questo: "objectA è un'istanza di un oggetto" è profondamente sbagliato. Se objectA era "un'istanza di objectB", allora deve essere che objectA inizia la vita con il tipo di objectB - qualunque esso sia - e lo stato corrente - qualunque esso sia. Che dire della creazione di oggetti D, E e F quando l'oggettoB cambia? No, no! È il caso concettuale e tecnico dell '"oggettoA è un'istanza di una classe". "Instantiation" e "instance of" hanno un significato preciso: un oggetto ottiene il tipo, le definizioni e i valori da una classe.
MyClass myClassyReference = null
Generalmente non diciamo "la variabile è assegnata a null" e non diciamo mai "la variabile fa riferimento a null", No. invece diciamo "la variabile è nulla"; o "la variabile non fa riferimento a nulla" o "il riferimento è nullo"
Applicazione pratica:
Pugno il dito sul tuo codice e dico "questa istanza ha una proprietà non valida. Forse è per questo che il ciclo fallisce. Devi convalidare i parametri durante l'istanza." (cioè argomenti del costruttore).
Lo vedo nel tuo codice,
MyClass myClassyReference;
myClassyReference.DoSomething();
"Hai dichiarato la variabile ma non l'hai mai assegnata. È nulla quindi non fa riferimento a nulla. Ecco perché la chiamata al metodo genera un'eccezione."
fine modifica
Un tipo di riferimento nome e il valore della variabile esiste indipendentemente. E intendo indipendente.
Un oggetto istanziato può o non può avere un riferimento ad esso.
Un oggetto istanziato può avere molti riferimenti ad esso.
Un riferimento dichiarato può o meno puntare a un oggetto.
Una variabile viene inizializzata con un valore. Un oggetto viene istanziato quando la memoria viene allocata per esso e il suo costruttore è stato eseguito.
Ad esempio, ecco una variabile:
Dim obj as Object
Questa variabile non è stata inizializzata . Una volta assegnato un valore alla obj
variabile, la variabile verrà inizializzata. Ecco alcuni esempi di inizializzazione:
obj = 1
obj = "foo"
L'istanziazione è una cosa molto diversa ma è correlata poiché l'istanza è solitamente seguita dall'inizializzazione:
Dim obj As New Object()
Nella riga di codice precedente, la obj
variabile viene inizializzata con il riferimento al nuovo Object
che è stato istanziato . Diciamo che il nuovo è Object
stato istanziato perché ne abbiamo creato una nuova istanza.
Ora credo che VB.NET renda questo molto più confuso di C # perché non è chiaro se si sta verificando un'assegnazione nel codice sopra. In C # è molto più chiaro che esiste sia un'istanza di un'istanza che un'inizializzazione di una variabile:
Object obj = new Object();
Per inizializzare qualcosa è impostarlo al suo valore iniziale. Per instantiate qualcosa è quello di creare un'istanza di esso.
Spesso questa è più o meno la stessa cosa. Questo:
SqlConnection conn = new SqlConnection();
crea un'istanza di un SqlConnection
oggetto e inizializza la conn
variabile impostandola su tale istanza.
Poiché il costruttore di un oggetto imposta anche le proprietà dell'oggetto sui valori predefiniti, è spesso corretto affermare che l'istanza di un oggetto lo inizializza. (Fuorviante, se l'oggetto espone un metodo che devi chiamare esplicitamente per inizializzarlo dopo che è stato istanziato, come a volte è il caso.)
Istanziato significa che è stata creata un'istanza dell'oggetto. Iniziato significa che lo stesso oggetto ha eseguito un'inizializzazione.
Quando si crea un'istanza di una classe o di un oggetto, si crea una nuova istanza o si alloca memoria per "conservarne" uno. L'inizializzazione di tale oggetto sarebbero le istruzioni eseguite durante l'istanza.
L'istanza è quando crei un'istanza di una classe. Quell'istanza è quindi un oggetto e puoi impostarne le proprietà o chiamare metodi su di essa (dirgli di fare le cose).
L'iniziazione è quando imposti una serie di condizioni iniziali per qualcosa. Quel qualcosa potrebbe essere un oggetto, in cui gli dici di inizializzarsi, o semplicemente una variabile a cui assegni un valore.
Un oggetto potrebbe inizializzare altre cose o persino istanziare altri oggetti come parte della sua iniziazione.
La differenza è che l'istanziazione è la creazione di una cosa che può fare cose; l'iniziazione è qualcosa che viene fatto.
Vedi i documenti Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
" Punto originOne = nuovo punto (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."
Possiamo vederlo in questo modo. Per una riga di codice di seguito:
var p = new Person();
La riga sopra può essere letta in due modi:
L'oggetto di riferimento o il contesto sono importanti. Quando parliamo in termini di variabile , usiamo la parola inizializzare . Quando parliamo in termini di classe / tipo , usiamo la parola istanza .
La creazione di istanze si riferisce all'allocazione di memoria per creare un'istanza di una classe mentre l'inizializzazione si riferisce alla denominazione di tale istanza assegnando il nome della variabile a tale istanza.
Per esempio: SqlConnection conn = new SqlConnection();
Ecco new
una parola chiave che alloca memoria per un'istanza ed conn
è un nome di variabile assegnato per quell'istanza.
Altri hanno spiegato la differenza, quindi non entrerò nei dettagli. Ma ci sono casi in cui la creazione di istanze non inizializza correttamente un oggetto. Quando si istanzia un oggetto, lo si inizializza anche con alcuni dati. La classe / tipo avrà la logica di inizializzazione, mentre la logica di istanziazione è tipicamente eseguita dalla new
parola chiave (fondamentalmente allocazione della memoria, copia dei riferimenti, ecc.). Ma l'istanziazione non deve necessariamente risultare in uno stato valido per gli oggetti che è quando possiamo dire che l'oggetto non è inizializzato . Ecco un esempio pratico in cui un oggetto può essere istanziato ma non inizializzato (scusate ad esempio in C #).
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
non chiama il costruttore per istanziare l'oggetto lì (ma qualche magia interna).
Si potrebbe anche obiettare che i tipi di valore non sono istanziati ma solo inizializzati poiché non è necessaria una nuova allocazione quando lo si fa, new..
ma dipende dalla propria definizione di istanziazione.