2016-02-05 30 views
0

我將一個'全局'對象作爲參數傳遞給一個方法。然後我初始化一個新的對象實例,並將其設置爲等於原始對象,在我的腦海中,我現在擁有該對象的2個實例。爲什麼我的傳遞對象被編輯

爲什麼當我改變第二個實例的第一個實例改變?我從來沒有使用'ref'。

namespace myNamespace 
{ 
    public class myClass 
    { 
     private myObjectClass myGlobalInstance; 

    public void myMethod() 
    { 
     doSomething(myGlobalObject);  
    } 

    private String doSomthing(myObjectClass myObjectInstance) 
    { 
      myObjectClass newObject = myObjectInstance; 
     newObject.variable1 = "boo"; //this seems to change both newObject.variable1 as required AND myObjectInstance.variable1 and its calling classes object 
    } 
    } 
} 
+0

myObjectClass NEWOBJECT = myObjectInstance;爲myObjectInstance設置一個引用。試試[ReferenceEquals](https://www.google.de/webhp?sourceid = chrome-instant&ion = 1&espv = 2&ie = UTF-8#q = c%23 + ReferenceEquals)函數,如果兩個對象在內存中爲同一對象 –

+1

,則返回true,因爲它的參考副本不是淺的或深度複製 – Szer

+0

這就是Value-和ReferenceTypes之間的區別... –

回答

0

您正在複製對象的引用這就是問題所在。 要創建具有相同屬性的另一個對象,你可以使用MemberwiseClone

public class GlobalObject 
{ 
    public GlobalObject GetCopy() 
    { 
     return (GlobalObject)MemberwiseClone(); 
    } 
} 

但是你要明白difference between ShallowCopy and DeepCopy

您的代碼將是這樣的:

namespace myNamespace 
{ 
    public class myClass 
    { 
     private GlobalObject myGlobalInstance; 

     public void myMethod() 
     { 
      doSomthing(myGlobalObject); 
     } 

     private String doSomthing(GlobalObject myObjectInstance) 
     { 
      GlobalObject newObject = myObjectInstance.Copy(); 
      newObject.variable1 = "boo"; 
     } 
    } 
} 
+0

是的,你必須理解答案的定義。沒有一個字的問題爲什麼... – TomTom

+0

@TomTom這是一個工具。它取決於你如何以及爲什麼使用它。 – Szer

+0

是的,Ignorane表明。試着讀他的問題。他要求解釋,而不是工作。 – TomTom

3

您未初始化新對象。你只是在這裏複製一個原始的參考:

myObjectClass newObject = myObjectInstance; 

這不一定是一個乾淨的解決方案,您的問題。根據您的類/對象的外觀,您可以使用MemberwiseClone。但由於這是一個受保護的方法,你必須將其暴露在myObjectClass像這樣:

public myObjectClass ShallowCopy() 
{ 
    return (myObjectClass) this.MemberwiseClone(); 
} 

然後調用它MyClass中:

myObjectClass newObject = myObjectInstance.ShallowCopy(); 

這將使的淺表副本你對象可能會或可能不會完成你想要的。從docs

的MemberwiseClone方法創建一個新的 對象,然後複製當前對象的非靜態字段 新對象創建一個淺表副本。如果字段是值類型,則執行 字段的逐位副本。如果一個字段是一個引用類型,那麼引用是 複製但引用的對象不是;因此,原始對象 及其克隆涉及相同的對象。

如果這還不夠,那麼您可能必須實施克隆方法來執行深層複製。上述文檔中還詳細說明了如何做到這一點。

+0

thx,你能完成你的代碼解決方案嗎? – Fearghal

+0

無處不在使用受保護的MemberwiseClone方法。 – Szer

+0

你是對的。他將不得不爲課程添加一個方法! –

1

RemoteConfigMgr類是一個引用類型,這意味着此類型的每個變量都只是對實際對象的引用(地址)。該行:

myObjectClass newObject = myObjectInstance;

意味着newObject變量現在將引用與myObjectInstance變量相同的對象。所以當你修改newObject時,你也在修改myObjectInstance。

+0

你知道我將如何解決? – Fearghal

相關問題