2016-10-27 1 views
1

Ich habe zwei Objekte, aber wenn ich eins aktualisiere, wird das andere Element mit der gleichen GUID aktualisiert, auch wenn ich versuche, eine neue GUID anzuwenden, damit ich sie trennen kann.Aktualisiere ein Objekt Aktualisiert das Andere irgendwie

var completedSecond = model.CompletedTransfers.First(); 
var transferedTransfers = model.TransferedTransfers.First(); 

if (transferedTransfers.Count != 0) { 
    transferedTransfers.RowId = Guid.NewGuid(); 
} 

Wenn ich diesen Code ausführen, haben die beiden Elemente die gleiche GUID, aber wenn ich die zweite Aktualisierung eine neue GUID zu haben, das erste Objekt wird auch, dass neue GUID. Wie ist das möglich?

+5

Sie haben nicht 2 Objekte, aber 2 Referenzen auf das gleiche Objekt im Speicher –

+0

ist es möglich, sie zu trennen? – Monzingo

+0

oder ein Objekt in ein anderes mit einer anderen GUID neu erstellen? – Monzingo

Antwort

5

Sie haben nicht 2 Objekte, sondern 2 Referenzen auf das gleiche Objekt im Speicher. In C# -Klassen sind Referenztypen, was bedeutet, dass Ihr completedSecond auf ein Objekt im Speicher verweist, das in diesem Fall dasselbe ist, auf das das Objekt transferedTransfers verweist.

Um 2 verschiedene Objekt zu erhalten müssen Sie ein neues Objekt ist ein copy constructor haben

  1. Durch die Implementierung des ICloneable interface

    public class MyClass : ICloneable 
    { 
        public Guid Id { get; set; } 
    
        public object Clone() 
        { 
         return new MyClass { Id = Id }; 
        } 
    } 
    
  2. andere Art und Weise instanziieren:

    public class MyClass 
    { 
        public Guid Id { get; set; } 
    
        public MyClass() { } 
    
        public MyClass(MyClass other) 
        { 
         Id = other.Id; 
        } 
    } 
    

Lesen Sie dies für die Unterschiede zwischen den beiden Möglichkeiten: Copy constructor versus Clone()

Darüber hinaus, wenn Sie über die Bewältigung von Objekten sprechen Sie haben, was Deep-Copy und Shallow-Copy genannt wird. Mehr über diese finden Sie hier:

+0

Also wie sieht die tatsächliche Instanziierung aus, da Sie etwas von etwas anderem (Klon) instanziieren? – Monzingo

1

dass die model.TransferedTransfers geschieht, weil durch Verweis übergebene Objekt, nicht von Wert. die Variable completedSecond und transferedTranstiert beide Punkte an model.CompletedTransfers. Berücksichtigen Sie auch die Namen Gerüche (transferedTranfers)

Verwandte Themen