Domanda

Nel progetto "DBUtility" di Petshop 4.0, la classe astratta SqlHelper ha un metodo "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;
    }

perché non restituire direttamente 'cachedParms'?

È stato utile?

Soluzione

Se sono stati restituiti direttamente cachedParms, il chiamante potrebbe quindi modificare gli elementi dell'array. Il contenuto della cache verrebbe quindi effettivamente danneggiato: il chiamante successivo per recuperare i parametri dalla cache con la stessa chiave cache otterrebbe risultati imprevisti.

EDIT: la clonazione dell'array stesso impedisce la sostituzione degli elementi con parametri diversi. Anche la clonazione degli elementi impedisce la modifica del parametro oggetti . Fondamentalmente è tutto codice di difesa.

Altri suggerimenti

Per aggiungere a ciò che ha detto Jon Skeet, se i valori della cache restituiti vengono utilizzati internamente, non si desidera che l'utente utilizzi valori che potrebbero cambiare senza che se ne accorgano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top