изменение кэша вместо локальной переменной (передача по ссылке)

#c# #asp.net #caching #byref #byval

#c# #asp.net #кэширование #по ссылке #byval

Вопрос:

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

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

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

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

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

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

Комментарии:

1. Это зависит. Можем ли мы, пожалуйста, посмотреть код, который вы используете? Очень сложно угадать ответ просто так.

2. Не могли бы вы опубликовать часть своего кода? Более чем вероятно, что объект, который вы помещаете в кэш, является ссылочным типом. Он не передается как ссылка, но сам объект является ссылкой, поэтому любые изменения, внесенные в него, будут отражаться везде, где на него ссылаются.

3. @Jay — как я могу написать код, чтобы предотвратить это? Нужно ли мне клонировать / копировать объект?

4. Скорее всего, смотрите Мой ответ ниже

Ответ №1:

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

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

Ответ №2:

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

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

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

Ответ №3:

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

Метод клонирования XmlNode