petshop 4.0のICloneableインターフェイスに疑問がありますか?

StackOverflow https://stackoverflow.com/questions/177836

  •  05-07-2019
  •  | 
  •  

質問

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」を直接返さない理由

役に立ちましたか?

解決

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

EDIT:配列自体のクローンを作成すると、要素が異なるパラメーターに置き換えられるのを防ぎます。要素のクローンを作成すると、パラメーター objects が変更されなくなります。基本的にはすべて防御的なコーディングです。

他のヒント

Jon Skeetが言ったことに追加するために、返されたCachedの値が内部的に使用される場合、ユーザーが気付かないうちに変化する可能性のある値を使用することは望ましくありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top