1

Petshop 4.0 の「DBUtility」プロジェクトでは、抽象クラス 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」を直接返さないのはなぜですか?

4

2 に答える 2

5

cachedParms が直接返された場合、呼び出し元は配列の要素を変更できます。その場合、キャッシュの内容は事実上破損します。同じキャッシュ キーを使用してキャッシュからパラメーターをフェッチする次の呼び出し元は、予期しない結果を取得します。

編集:配列自体を複製すると、要素が別のパラメーターに置き換えられなくなります。要素のクローンも同様に作成すると、パラメーターオブジェクトが変更されるのを防ぐことができます。基本的に、それはすべて防御的なコーディングです。

于 2008-10-07T10:08:18.643 に答える
0

Jon Skeet が言ったことに加えて、返されたキャッシュされた値が内部で使用されている場合、ユーザーが気付かないうちに変更される可能性のある値を使用したくありません。

于 2008-10-07T10:20:17.717 に答える