PetShop 4.0의 IClonable 인터페이스에 의문이 있습니까?
-
05-07-2019 - |
문제
PetShop 4.0의 'DBUTIME'프로젝트에서 추상 클래스 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를 직접 반환하면 발신자가 배열의 요소를 변경할 수 있습니다. 그런 다음 캐시의 내용이 효과적으로 손상됩니다. 다음 발신자는 동일한 캐시 키로 캐시에서 매개 변수를 가져 오는 사람이 예상치 못한 결과를 얻습니다.
편집 : 배열 자체를 복제하면 요소가 다른 매개 변수로 대체되는 것을 방지합니다. 요소를 복제하면 매개 변수가 방지됩니다 사물 돌연변이. 기본적으로 그것은 모두 방어 코딩입니다.
다른 팁
Jon Skeet의 말에 추가하기 위해, 반품 캐시의 값이 내부적으로 사용되면 사용자가 알지 못하고 변경할 수있는 값을 사용하는 것을 원하지 않습니다.
제휴하지 않습니다 StackOverflow