Вопрос

В проекте '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 используются внутренне, то вы не хотите, чтобы пользователь использовал значения, которые могут измениться без их ведома.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top