petshop 4.0のICloneableインターフェイスに疑問がありますか?
-
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の値が内部的に使用される場合、ユーザーが気付かないうちに変化する可能性のある値を使用することは望ましくありません。
所属していません StackOverflow