Frage

Ich habe eine Variante auf dem von ref Frage. Ich weiß, dass alle mit dem ref oder unsere Parameter über Aufruf und wie sie sich auf Variablen und deren Werte. Ich hatte dieses Problem mit einem Datatable und ich möchte wissen, warum eine Datentabelle ist anders als ein einfaches Integer-Variable.

Ich habe die physische Antwort auf, wie das Problem zu beheben, aber ich möchte wissen, warum es so funktioniert, es funktioniert.

Wenn Sie einfache Variablen verwenden es tut, was ich erwartet

        int mVar1 = 1;
        int mVar2 =1;

        mVar2 = mVar1;

        mVar2 = 5;

        Console.WriteLine(mVar1.ToString());
        Console.WriteLine(mVar2.ToString());

zeigt es 1,5 in der Konsole.

Aber wenn man das Gleiche mit einem Datatable tun macht es einen Verweis auf die erste Datentabelle statt einen neuen Wert:

        DataTable mVar3 = new DataTable();
        DataTable mVar4 = new DataTable();


         // Create DataColumn objects of data types.
        DataColumn colString = new DataColumn("StringCol");
        colString.DataType = System.Type.GetType("System.String");
        mVar3.Columns.Add(colString);

        // Create DataColumn objects of data types.
        DataColumn colString2 = new DataColumn("StringCol123");
        colString2.DataType = System.Type.GetType("System.String");
        mVar4.Columns.Add(colString2);

        foreach (DataColumn tCol in mVar3.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }
        foreach (DataColumn tCol in mVar4.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }

                mVar4 = mVar3;

        //change mVar4 somehow and see if mVar3 changes


        foreach (DataColumn tCol in mVar4.Columns)
        {
            tCol.ColumnName = "Test";

        }

        foreach (DataColumn tCol in mVar3.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }

        foreach (DataColumn tCol in mVar4.Columns)
        {
            Console.WriteLine(tCol.ColumnName);

        }

Die Konsole zeigt: StringCol StringCol123 Prüfung Test

mit den Worten mVar4 = mVar3 es verursacht mVar4 ein Verweis auf mVar3 sein.

Die Lösung für dieses Problem ist zu sagen,

DataTable mVar4 = mVar3.Copy(); 

Also meine Frage ist: Was ist eine Datentabelle verursacht auszuführen anders als ein einfaches Integer-Feld. Warum schafft es eine Referenz, wenn ich mVar4 = mVar3 anstelle einer anderen Kopie der Datatable?

War es hilfreich?

Lösung

Sie laufen gegen die Differenz zwischen einem Referenztyp und einem Werttyp.

Hier ist ein Msdn Artikel auf Unterschiede .

Eine anschaulichere Antwort wäre, dass beide die gleiche Operation tatsächlich ausgeführt wird, ist der Unterschied, dass im ersten Beispiel (die beide ganzen Zahlen) die Zuordnung von mVar2 = mVar1 wird, um den Wert von mVar1 zu mVar2 Zuordnung, die 1 ist. Doch im Fall der Datatable, ist, was tatsächlich zugewiesen wird, ist ein Speicherplatz, keine Datentabelle.

Nehmen wir zum Beispiel, dass die Datatable erstellt Sie wohnt in Speicherplatz 20. Das, dass der Referenz mVar1 eine Referenz halten würde an dieser Stelle (20) bedeuten würde. Wenn Sie die Zuordnung mVar2 = mVar1 tun, sind Sie mVar2 sagen, den gleichen Wert wie mVar1 zu halten, so mVar2 dann Verweise auf Speicherstelle 20 als auch. Das Ergebnis ist, dass beide Variablen die gleiche Datentabelle verweisen.

Um das Verhalten zu erreichen, die Sie beschreiben, würden Sie in der Tat eine Kopie Fähigkeit haben müssen, wie Sie gesagt haben. Es wäre ein völlig neues Objekt zuweisen hat, und den Zustand des vorherigen Objekts in den neuen kopieren.

Für die Datatable-Klasse Sie es wie diese in einer Erweiterungsmethode erweitern konnten:

public static DataTable Copy(this DatTable original)
{
   var result = new DataTable();
   //assume Property1 was a property of a DataTable
   result.Property1 = original.Property1; 
   //continue copying state from original to result
   return result;
}

Andere Tipps

Der Aufruf mVar2 = mVar1; Kopien der an der Stelle des mVar1 gespeicherten Wert. In diesem Szenario bedeutet, dass 1 in der der Lage mVar2 kopiert. In der zweiten Situation der Wert bei mVar3 gespeichert wird wieder auf den Standort der mVar4 kopiert. Doch in diesem Fall, da ein Datatable ein Referenztyp ist, der Wert, der kopiert wird, ist der Hinweis auf das tatsächliche Datatable-Objekt.

Um dies zu zeigen weiter, fügen Sie den folgenden bis zum Ende des Codes Sie auf dem Laufenden:

        mVar4 = new DataTable();
        // Create DataColumn objects of data types.
        DataColumn colString3 = new DataColumn("StringCol1234");
        colString2.DataType = System.Type.GetType("System.String");
        mVar4.Columns.Add(colString3);

        foreach (DataColumn tCol in mVar3.Columns)
        {
            Console.WriteLine(tCol.ColumnName); // still outputs test

        }

        foreach (DataColumn tCol in mVar4.Columns)
        {
            Console.WriteLine(tCol.ColumnName); // now outputs StringCol1234

        }

Hier, wenn Sie mVar4 auf eine neue Instanz eines Datatable wieder eingestellt, dann machte die Änderungen nicht in mVar3 wider. Dies liegt daran, den Ruf mVar4 = new Datatable (); die Referenz an der Stelle des mVar4 ändert, ist es nicht das Objekt von mVar4 verwiesen ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top