문제

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의 말에 추가하기 위해, 반품 캐시의 값이 내부적으로 사용되면 사용자가 알지 못하고 변경할 수있는 값을 사용하는 것을 원하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top