изменяемый кеш вместо локальной переменной (передается по ссылке) - PullRequest
2 голосов
/ 25 мая 2011

Я пишу приложение .net c #.

Я извлекаю некоторые данные из файла xml, кэширую данные в кэш .net и возвращаю их из моего метода.Я выполняю некоторую обработку данных и возвращаю другую часть моего приложения.

Следующий вызов, я читаю из кеша, обрабатываю его и возвращаю его и т. Д.

Проблема в том, чтообработка, выполняемая с данными кэша, похоже, изменяет кэш, а не локальную переменную, что означает, что при следующем чтении из кэша будут обработаны данные предыдущей обработки.

Таким образом, кажется, что данныевозвращается из кеша, возвращается по ref, а не по значению.

Есть идеи, как предотвратить изменение кеша?

Ответы [ 3 ]

5 голосов
/ 25 мая 2011

В кеше памяти будет храниться указатель на объект.Это как глобальная переменная.Любые другие назначения переменных для кэшированного элемента будут ссылаться на тот же объект.Это отличается для внешнего или распределенного кэша.Для этих типов кэша объект должен быть сериализован и десериализован из кэша.В этих случаях вы получаете копии.

Если вы хотите смоделировать такое поведение вне процесса, вы можете скопировать / клонировать объект или сериализовать / десериализовать объект в вне кэша.

3 голосов
/ 25 мая 2011

Это довольно фундаментальная вещь, которую вам нужно понять о типах данных.

Похоже, ваш кеш хранит ссылочные типы, то есть экземпляры объектов или что-то в этом роде. Когда вам передают один из них, вы возвращаете ссылку на экземпляр, сама ссылка фактически передается обратно по значению, то есть вы не можете изменить ссылку, но, конечно, может быть изменена эта ссылка это поведение, которое вы видите.

Если вы хотите, чтобы это работало так, чтобы экземпляры не изменялись при работе с ними, сначала сделайте их копию. (вам может понадобиться написать метод клонирования, если они являются сложными типами)

1 голос
/ 25 мая 2011

В зависимости от типа решение может просто заключаться в клонировании объекта / элемента при извлечении из кэша.

Метод клона XmlNode

...