2017-01-19 8 views
1

Wenn wir nur ein Objekt einer Klasse deklarieren, ohne es wie unten zu instanziieren, behandelt es dann als null oder leer oder sonst?Ein Objekt einer Klasse als null deklarieren

Example1: Directory objDEntry;

Example2: Directory objDEntry = null;

Gibt es einen Unterschied zwischen Example1 und Example2 oder sie sind gleich?

+1

Beide sind gleich, da 'null' der Standardwert für alle Variablen des Referenztyps ist –

+0

Technisch hat es einen Wert von null. Der C# -Compiler wird jedoch das Objekt nicht verwenden, bis ihm explizit ein Wert zugewiesen wurde (selbst wenn dieser Wert "null" ist). – Abion47

+1

kein Unterschied, beide sind null. Aber in einigen Typen sind defualt Wert, wie int X; X ist Standard 0. – onur

Antwort

2

Es ist abhängig; Wenn Sie ein Feld, z.

public class MyClass { 
    // objDEntr will be initialized by null 
    Directory objDEntr; 
    // the initialization is redundant here 
    Directory objDEntry2 = null; 
    ... 

gibt es keinen Unterschied, da Felder durch ihre Standardwerte initialisiert und null ist der Standardwert für Referenztypen. lokale Variablen werden jedoch nicht standardmäßig initialisiert;

so
public static void MyMethod() { 
    // objDEntry contains trash, must be initialized further 
    Directory objDEntry; 
    // objDEntry2 is null 
    Directory objDEntry2 = null; 
    ... 

in dem "Beispiel 1" trash objDEntry enthält, während in dem "Beispiel 2" objDEntry richtig initialisiert und enthält null.

0

Wenn Sie eine Referenztypvariable deklarieren, ist die Variable im Grunde ein Zeiger auf eine Speichersammlung, die ein bestimmtes Objekt darstellt. Zum Beispiel, in Ihrem Fall, wenn Sie deklarieren eine Dictionary Variable:

Dictionary objDict; 

, dass der Zeiger erzeugt, die an einem Dictionary Objekt im Speicher verweisen. Wenn es jedoch zuerst so deklariert wird, zeigt die Variable nicht auf irgendetwas. Der Versuch, die Variable zu diesem Zeitpunkt in Berechnungen zu verwenden, führt zu einem NullReferenceException.

Auf der anderen Seite, wenn Sie ein Objekt erstellen, reserviert es Speicher für dieses Objekt. (. Aus Gründen dieser Erklärung, genau dort, wo es ordnet die Speicher irrelevant ist) Also, wenn Sie ein Objekt erstellen Dictionary:

new Dictionary(); 

, dass der Speicher zuteilen wird, notwendig, die Dictionary Objekt darzustellen.

Wenn Sie diese beiden Aktionen zusammen binden, das ist, was Sie tun, wenn Sie eine Referenz-Typ Variable zuweisen:

Dictionary objDict = new Dictionary(); 

Die Variable objDict nun im Speicher für das Objekt zugewiesen zeigt.

Wenn Sie jetzt null der Führungsgröße zuweisen, werden Zurücksetzen Sie im Grunde ist es in den Grundzustand - der Zustand, in dem der Zeiger auf nichts zeigt. In diesem Sinne sind die Linien:

Dictionary objDict; 

und

Dictionary objDict = null; 

wird so weit wie die CLR betroffen ist identisch sein. Der C# -Compiler enthält jedoch seine eigenen Einschränkungen für Variablendeklarationen.Es wird durch Kompilierungsfehler vorschreiben, dass eine Referenzvariable nicht verwendet werden kann, bis garantiert ist, dass sie explizit instanziiert wurde. Zum Beispiel wird die folgende kompilieren, aber einen Fehler zur Laufzeit werfen:

Dictionary objDict = null; 
string s = objDict.ToString(); 

Dieser Code wird jedoch bei der Kompilierung fehlschlagen, mit der Fehlermeldung von „Verwendung von nicht zugewiesenen lokalen Variablen‚objDict‘“ :

Dictionary objDict; 
string s = objDict.ToString(); 

Wie Dmitry in seiner Antwort sagt, gilt diese Regel jedoch nur für lokale Variablen. Class-Niveau und über Variablen nicht einen solchen Fehler produzieren, so wird der folgende Code in Ordnung sein:

Dictionary objDict; 

public void DictToString() 
{ 
    string s = objDict.ToString(); 
} 

Um zu erklären, was Hameed redet, eine Referenzgröße ist ein Zeiger auf ein Objekt im Speicher , aber wenn Sie eine zugewiesene Variable nehmen und sie auf null setzen, ist das vorherige Objekt noch im Speicher - es wurde gerade verwaist. Wenn die CLR die Speicherbereinigung ausführt, sucht sie genau nach diesen verwaisten Objekten und gibt ihren Speicher frei.

Es werden (normalerweise) keine Objekte gesammelt, auf die noch aktive Zeiger zeigen, weshalb es für einige Objekte ratsam ist, sie zu entfernen, indem die Variablen, die auf sie zeigen, auf null gesetzt werden Sie werden ordnungsgemäß veröffentlicht, wenn die nächste Müllsammlung kommt.

Verwandte Themen