2008-10-07 2 views
1

В проекте 'DBUtility' из зоомагазинов 4.0, абстрактный класс SqlHelper имеет метод 'GetCachedParameters':Сомневаетесь с интерфейсом ICloneable в petshop 4.0?

 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' напрямую?

ответ

5

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

EDIT: Клонирование массива не позволяет заменять элементы различными параметрами. Клонирование элементов также предотвращает изменение параметров объектов. В принципе, это все защитное кодирование.

0

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

Смежные вопросы