2013-10-09 43 views
0

當我編寫這段代碼時,我發現一個意外的情況,我該如何解決這個問題?C中的對象變化#

KurumReferans tempReferans = new KurumReferans(); 
tempReferans = kRef; 

if (kurumDetaylari.IsTakipMekanizmasiKullaniyor == true) 
{ 
    KurumReferans kRefIstakip = new KurumReferans(); 
    kRefIstakip = kRef; 
    kRefIstakip.Referans = "SORUMLU"; 
    kRefIstakip.Yontem = "SORUMLU:"; 
    kRefIstakip.Tipi = Tipi.Zorunlu; 
    kRefIstakip.Parent = kurum; 
    PostAddEdit(db.KurumReferans, kRefIstakip, cmd, "", "", "", ""); 
} 

首先我給你,

tempReferans = kRef; 

當我給你kref到其他對象後,

KurumReferans kRefIstakip = new KurumReferans(); 
kRefIstakip = kRef; 
kRefIstakip.Referans = "SORUMLU"; 

tempReferans對象的值發生變化,但我想舊值。

+5

您需要進行深層複製,但您正在做參考分配。 –

回答

8

你的對象正在變化,因爲當你分配一個對象時,它只是給它分配地址,並且這兩個變量都使用相同的內存空間或對象。爲了克服這個問題,你必須做一個對象的深層拷貝並賦值。

public static T DeepClone<T>(T obj) 
{ 
using (var ms = new MemoryStream()) 
{ 
    var formatter = new BinaryFormatter(); 
    formatter.Serialize(ms, obj); 
    ms.Position = 0; 

    return (T) formatter.Deserialize(ms); 
} 
} 

編輯:你有標記與屬性[序列化]

+3

如果對象不可序列化會發生什麼? –

+0

如果可能的話,您可以使用結構這個 – FLCL

+0

結構也是一個不錯的主意,改變 –

0

在行類:

kRefIstakip = kRef; 

對象kRef也通過引用kRefIstakip。因爲您將kRef實例指定爲kRefIstakip,而不是將kRef複製到kRefIstakip

參考類型對象,代碼:

obj1 = obj2; 

並不的obj2的值複製到obj1,但它拷貝obj2參照obj1。然後兩者都可以訪問相同的內存位置。