Сомнение с интерфейсом ICloneable в petshop 4.0? - PullRequest
1 голос
/ 07 октября 2008

В проекте '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' напрямую?

Ответы [ 2 ]

5 голосов
/ 07 октября 2008

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

РЕДАКТИРОВАТЬ: клонирование самого массива предотвращает замену элементов с другими параметрами. Клонирование элементов также предотвращает мутацию параметра objects . В основном это все защитное кодирование.

0 голосов
/ 07 октября 2008

Чтобы добавить к тому, что сказал Джон Скит, если возвращаемые значения Cache'd используются для внутреннего использования, вы не хотите, чтобы пользователь использовал значения, которые могут измениться без их ведома.

...