簡體   English   中英

如何將實例數據復制到/覆蓋現有的類引用? C#

[英]How to copy instance data into/over an existing class reference? C#

上下文:我正在嘗試編寫一個資源/內容管理器。 加載內容時,會分配一個描述資源並保存非托管數據的類並將其傳遞回調用者。 我希望此管理器具有的一個功能是能夠在程序運行時重新加載資產。 然而,此時對資源的引用可能已在程序的各個部分共享,根據我的理解,創建新資源並分配舊引用只會將該特定變量的引用更改為新資源,並且其余保持不變。

因此,我的問題是:如何創建類的新實例,並將其復制到前一個資源所在的內存塊中? 或者,我認為這里真正的問題是:我如何避免無法做到這一點? (我假設由於指針的任意性質,具有不同的數據,尤其是不同大小的數據無論如何都不起作用,但我不知道,也無法在其他地方找到答案。)

推測(可以隨意跳過):關於第二個問題的解決方案,我的第一個猜測是使用標識符傳遞對內容管理器本身的引用,但這似乎相當笨拙,必須在一個位置傳遞多個引用。 另一種解決方案是在重新加載時觸發事件系統,但讓使用這些資源的每個類都必須管理此事件似乎也是一個壞主意。

如果需要更多上下文的人可能能夠回答,請發表評論,謝謝。

如果您可以獲得指向非托管內存的指針,則完全有可能用其他內容覆蓋它,有關如何操作的一些信息,請參閱copy intptr 如果內存已被復制到其他地方,或者新數據與舊數據的大小不同,這將不起作用。

您可以對值類型的托管數組執行類似操作,但我認為您無法獲得指向引用類型對象的指針。 因此,您無法就地替換參考對象。 但是,如果需要,您可以使用反射來更改對象中的字段,但通常不建議這樣做。

解決此類問題的一種方法是使用間接方法。 與其共享對象,不如共享一個允許替換對象的包裝器。 也可以向這個包裝器添加一個在對象被替換時引發的事件。 對於這個系統,各種組件可能需要監視資源的變化並進行適當的處​​理。

如果這是針對游戲,我會考慮重新啟動整個圖形系統並重新加載所有資源,這可能比確保所有組件正確處理重新加載更容易。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM