2011-05-24 46 views
2

我在寫一個.net c#應用程序。緩存被修改,而不是局部變量(通過ref傳遞)

我從xml文件中檢索一些數據,將數據緩存到.net緩存並從我的方法中返回。我對數據執行一些處理並將其返回到我的應用程序的另一部分。

下電話,我從緩存中,並處理讀取並返回等

我的問題是,在高速緩存中的數據執行的處理似乎修改高速緩存,而不是局部變量,這意味着下一個我從緩存中讀取它從之前處理返回的已處理數據。

所以看起來,緩存返回的數據是由ref返回而不是值。

任何想法如何我可以防止緩存被修改?

+2

這取決於。我們可以請看看您使用的代碼嗎?像這樣猜測答案是非常困難的。 – Ryan 2011-05-24 22:21:10

+0

你能發佈一些你的代碼嗎?你放入緩存的對象很可能是一個引用類型。它不作爲參考傳遞,但對象本身是一個引用,所以對它進行的任何更改都會反映它被引用的任何地方。 – Jay 2011-05-24 22:21:31

+0

@Jay - 我如何編碼以防止這種情況?我需要克隆/複製對象嗎? – amateur 2011-05-24 22:35:58

回答

3

這是你需要了解的數據類型相當根本的東西。

這聽起來像你的緩存存儲引用類型,即對象的實例或類似的東西。當你通過其中的一個你得到一個對實例的引用時,引用本身實際上是通過值傳回來的,也就是說你不能改變引用,但是當然它所指向的thihg是可以改變的,那就是你所看到的行爲。

如果您希望這樣工作,以便在使用它們時實例保持不變,請首先製作它們的副本。 (如果它們是複雜類型,則可能需要編寫一個克隆方法)

5

內存高速緩存中將存儲指向該對象的指針。它像一個全局變量。對緩存項目的任何其他變量賦值都將引用同一個對象。這對於進程外或分佈式緩存而言是不同的。對於這些類型的緩存,該對象必須從緩存中序列化和反序列化。在這些情況下,你正在獲取副本。

如果你想模擬進程外的行爲,你可以複製/克隆一個對象或者序列化/反序列化超出緩存的對象。