Frage

In der 'DBUtility' Projekt von Petshop 4.0, die abstrakte Klasse SqlHelper hat eine Methode '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;
    }

warum nicht wieder die 'cachedParms' direkt?

War es hilfreich?

Lösung

Wenn cachedParms direkt zurückgegeben wurde, kann der Anrufer dann die Elemente des Arrays ändern. Der Inhalt des Cache würde dann effektiv beschädigt werden. - der nächste Anrufer die Parameter aus dem Cache mit dem gleichen Cache-Schlüssel zu holen würde unerwartete Ergebnisse

EDIT: Klonierung des Array selbst die Elemente verhindert, mit anderen Parametern ersetzt. die Elemente Klonen als auch verhindert, dass der Parameter Objekte mutiert. Im Grunde ist es alle defensive Codierung.

Andere Tipps

, um hinzuzufügen, was Jon Skeet sagte, wenn die return'd Cache'd Werte verwendet werden intern für die dann wollen Sie nicht den Benutzer unter Verwendung von Werten sein, ohne dass sie sich dessen bewusst verändern könnte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top