讓我們通過各行:
myObject bob; // Creates a variable of type myObject, but it doesn't point anywhere
bob = new myObject(); // bob now points to a newly created myObject instance
myObject joe; // Creates a variable of type myObject, but it doesn't point anywhere
joe = bob; // joe now refers to the same object as bob
要記住的重要一點是,最後一行拷貝超過參考本身的價值。如果bob
指向地址1000,那麼joe
也將指向那裏。因此,如果您更改此地址上的任何數據,joe
和bob
都將指向相同的數據。
但是,歡迎您將joe
設置爲點在其他地方,它不會影響bob
。換句話說:
joe = null; // This will not null out bob
如果你想創建的myObject
一個全新例如,你必須這樣做:
joe = new myObject(); // This will also not affect bob
現在,如果你想創建一個在內存myObject
和拷貝過來所有現有實例的屬性的新實例,你必須這樣做你自己:
joe = new myObject();
joe.X = bob.X; // Assuming X is not a reference itself
joe.Y = bob.Y; // ...or you'd have to do this recursively
.NET不提供爲您執行此複製的方法。一個常見的模式是讓爲myObject()
一個構造函數的myObject
並複製其所有屬性的實例:
joe = new myObject(bob);
上述分配後,bob和joe指向內存中的同一實例。鮑勃和喬可以被認爲是指針變量。要創建副本,請創建一個新實例,然後複製每個成員。當然,這可以用一種方法進行編碼。 –
我會問自己的第一個問題是'爲什麼我需要這個對象的確切副本?'如果您發現需要大量相互獨立的對象的相似/相同副本,則可以考慮查看對象工廠樣式模式。 – Vassi
你能詳細說明一下哪些具體的答案不適合你嗎?似乎沒有任何其他問題,這些答案缺乏。看起來好像你只是在說「我不明白答案」,這不是一個真正的問題,如果它被解釋爲一個問題,就不可能回答。 –