Сомнение с интерфейсом ICloneable в petshop 4.0?
-
05-07-2019 - |
Вопрос
В проекте 'DBUtility' Petshop 4.0 абстрактный класс SqlHelper имеет метод 'GetCachedParameters':
public static SqlParameter[] GetCachedParameters(string cacheKey) {
SqlParameter[] cachedParms = (SqlParameter[])parmCache[cacheKey];
if (cachedParms == null)
return null;
SqlParameter[] clonedParms = new SqlParameter[cachedParms.Length];
for (int i = 0, j = cachedParms.Length; i < j; i++)
clonedParms[i] = (SqlParameter)((ICloneable)cachedParms[i]).Clone();
return clonedParms;
}
почему бы не вернуть 'cachedParms' напрямую?
Решение
Если cachedParms были возвращены напрямую, то вызывающая сторона может изменить элементы массива. В этом случае содержимое кэша будет эффективно повреждено - следующий вызывающий, извлекающий параметры из кэша с тем же ключом кэша, получит неожиданные результаты.
РЕДАКТИРОВАТЬ: клонирование самого массива предотвращает замену элементов с другими параметрами. Клонирование элементов также предотвращает мутацию параметра objects . В основном это все защитное кодирование.
Другие советы
Чтобы добавить к тому, что сказал Джон Скит, если возвращаемые значения Cache'd используются внутренне, то вы не хотите, чтобы пользователь использовал значения, которые могут измениться без их ведома.