2016-06-01 14 views
-1

Es tut mir leid, wenn meine Frage dumm ist, ich bin neu in cDifferenz zwischen Liste <T> und Liste <T> = new List <T> in C#

#

Ich will wissen, was ist der genaue Unterschied zwischen dem, wenn wir eine Liste Variable erstellen wie diese

List<T> lstStudents; 

und wenn wir eine Liste wie diese

List<T>= new List<T>(); 

ich gerade heraus erstellen gefunden, dass selbst wenn wir creat ea Variable ohne Initialisieren ein Objekt, um es, noch würden wir in der Lage sein, neue Objekte hinzufügen, wenn es so ist, dann ist das, was ist der Unterschied zwischen diesen beiden lassen Sie mich das Szenario mit einigen Code erklären, die ich versuchte,

List<Product> product = new List<Product> { 
             new Product() { ProductID = 1, ProductName = "A" } 
             , new Product() { ProductID = 2, ProductName = "B" } 
             , new Product() { ProductID = 3, ProductName = "C" } 
             , new Product() { ProductID = 4, ProductName = "D" } 
             , new Product() { ProductID = 5, ProductName = "E" } 
            }; 

jetzt, wenn ich hinzufügen, eine Variable wie diese

List<Product> p = product; 

ich bin noch in der Lage Objekte in diesen variablen

p.Add(new Product { ProductID = 3 }); 

Bitte klären meine Zweifel hinzuzufügen.

Danke

Es tut mir leid kann ich etwas falsch in diesem Code

public class Students 
    { 
     public string Name { get; set; } 
     public int StudentId { get; set; }  
    } 

    List<Product> product = new List<Product> { 
             new Product() { ProductID = 1, ProductName = "A" } 
             , new Product() { ProductID = 2, ProductName = "B" } 
             , new Product() { ProductID = 3, ProductName = "C" } 
             , new Product() { ProductID = 4, ProductName = "D" } 
             , new Product() { ProductID = 5, ProductName = "E" } 
            }; 


      List<Product> p = product; 
      p.Add(new Product { ProductID = 3 }); 

, wenn ich dieses laufen tue ich erhalte 6 Artikel statt 5

+2

die erste doesnt * * Erstellen Sie eine Liste überhaupt, es ist nur die var und seine Art erklärt. 'new' erzeugt/initialisiert das eigentliche Objekt – Plutonix

+4

Der erste deklariert eine Variable vom Typ' List ', die auf 'null' initialisiert wird, vorausgesetzt, der Typ' T' ist definiert. Der zweite ist ein Syntaxfehler. –

+0

Es gibt kein Beispiel von "ohne ein Objekt zu initialisieren, noch wären wir in der Lage, neue Objekte hinzuzufügen" - was wahrscheinlich hervorheben würde, was "Initialisierung" eigentlich für Sie bedeutet (wahrscheinlich anders als übliche Bedeutung) –

Antwort

3

jetzt, wenn ich hinzufügen, eine Variable wie diese

List<Product> p = product; 

ich noch in der Lage bin Objekte in diesen Variablen, weil

Ja, hinzufügen die Variablen verweisen auf die gleiche Liste. Wenn Sie sich die ansehen, werden Sie feststellen, dass das hinzugefügte Element auch dort reflektiert wird.

i habe gerade herausgefunden, dass selbst wenn wir eine Variable ohne Initialisieren ein Objekt, um es zu erstellen, noch würden wir in der Lage sein, neue Objekte hinzufügen

Nicht wahr - wenn Sie dies tun:

List<T> lstStudents; 

und versuchen, etwas hinzuzufügen:

lstStudents.Add(...); 

Sie einen Compiler erhalten erro wird r wenn die Listendeklaration innerhalb einer Methode ist, und NullReferenceException wenn es ein Klassenmitglied ist, weil lstStudents nichts referenziert (es ist eine "Null" -Referenz).

, wenn ich diese laufen bekomme ich 6 Artikel statt 5

Ja, weil die Liste von product verwiesen 5 Elemente enthalten, p verweist auf die gleiche Liste, und Sie eine hinzugefügt.

Listen sind Referenztypen, was bedeutet, dass das „Kopieren“ der Wert einer Variablen auf eine andere Variable kopiert nur ein Referenz auf das zugrunde liegende Objekt. Es ist verwandt mit Zeigern in älteren Sprachen wie C.

+0

Ich habe gerade meine Frage bearbeitet können Sie bitte einen Blick darauf und mir helfen, ein wenig besser zu verstehen Vielen Dank –

+0

Vielen Dank für Ihre Hilfe ... Es hat mir geholfen :) –

1
List<T> lstStudents; 

null ist und:

List<T> lstStudents = new List<T>(); 

Ist eine leere Liste. Beispiel:

List<T> lstStudents; 
lstStudents.add(new Student("Bob")); // this will throw a null exception 

List<T> lstStudents = new List<T>(); 
lstStudents.add(new Student("Bob")); // this work just fine 

auch, wie oben erwähnt:

List<T>= new List<T>(); 

Ist eine fehlerhafte Syntax aufgrund der Tatsache, dass Sie nicht einen Variablennamen zuweisen.

+0

"ist null "- wenn es ein Klassenmitglied ist, ja. Für eine lokale Variable ist sie einfach nicht initialisiert, und der Compiler lässt Sie nicht lesen, bis sie geschrieben ist. –

+0

Ich habe gerade meine Frage bearbeitet können Sie bitte einen Blick darauf werfen und mir helfen, ein wenig besser zu verstehen Vielen Dank –

+0

@ MindingDatas Antwort unten sollte dies für Sie klären. Beachten Sie seine Erläuterungen dazu, wie Listen Referenztypen sind. Wenn Sie 'p' auf' product' setzen, geben Sie nur p an, um auf die gleiche 'List' im Speicher als Produkt zu zeigen. Wenn Sie einen ändern, ändern Sie den anderen. – LukeP

1

Es sieht also so aus, als ob Sie 3 verschiedene Möglichkeiten haben, eine Liste "zu erstellen".

List<T> lstStudents; 

Dies erstellt eine Liste, aber es zeigt nicht auf irgendetwas. Es ist null. Wenn Sie versuchen, Elemente hinzuzufügen, erhalten Sie eine Null-Referenz-Ausnahme.

List<T> listStudents = new List<T>(); 

Dies erstellt eine neue Liste im Speicher. Es ist leer und Sie können Dinge wie gewohnt hinzufügen.

List<T> list1 = new List<T>() { // Add some items here}; 
List<T> list2 = list1; 
Student newStudent = new Student(); 
list2.add(newStudent); 
list1.Contains(newStudent); // This equals true. 

Jetzt ist dies, wo ich denke, dass Sie verwirrt werden können. Eine Liste ist eine Referenzvariable in C#. Das bedeutet, dass zwei verschiedene Zeiger auf dieselbe Liste zeigen können. Im obigen Beispiel haben wir unsere erste Liste erstellt und einige Elemente hinzugefügt. In der nächsten Zeile haben wir eine zweite Liste erstellt, aber auf die erste Liste "gerichtet". Wir fügen dann einen neuen Schüler zur zweiten Liste hinzu und erscheinen magisch in der ersten Liste? Wie? Es ist, weil die erste und die zweite Liste eigentlich gleich sind. Sie haben nur zwei verschiedene Zeiger auf den gleichen Speicherplatz im Speicher.

Weitere Lesung am Referenztyp, hier ist die offizielle MSDN-Dokumentation: https://msdn.microsoft.com/en-us/library/490f96s2.aspx

+0

* Dies erstellt eine Liste, aber es deutet nicht auf irgendetwas hin. Es ist null. Wenn Sie versuchen, Elemente hinzuzufügen, erhalten Sie eine Null-Referenz-Ausnahme. * Alles falsch, es erstellt einen * Platzhalter * für eine Liste, es ist nicht einmal Null, wenn Sie es in Klassenebene definieren der Compiler wird es so zu ändern Wenn es eine Null zugewiesen wäre, aber wenn Sie es lokal für eine Funktion erstellen, würde es nicht einmal kompilieren, da der Compiler eine Ausnahme ergibt, weil die Variable nicht initialisiert ist. – Gusman

+0

Ich habe gerade meine Frage bearbeitet können Sie bitte einen Blick darauf werfen und mir helfen, ein wenig besser zu verstehen Vielen Dank –

+0

@Gusman "aber wenn Sie es lokal auf einer Funktion erstellen würde es nicht einmal kompilieren". Ich bin mir nicht sicher, ob ich dich richtig verstehe. https://dotnetfiddle.net/sOlj6H – MindingData

Verwandte Themen