سؤال

في مشروع "DBUtility" من Petshop 4.0، 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 مباشرة، المتصل يمكن بعد ذلك تغيير عناصر المصفوفة. محتويات ذاكرة التخزين المؤقت وعندئذ تكون تالفة بشكل فعال - المتصل المقبل لجلب المعلمات من ذاكرة التخزين المؤقت مع مفتاح مخبأ نفسه سوف تحصل على نتائج غير متوقعة

وتحرير: استنساخ مجموعة نفسها يمنع العناصر يتم استبداله مع معلمات مختلفة. استنساخ العناصر وكذلك يمنع المعلمة <م> التحف يجري تحور. أساسا كل شيء الترميز دفاعي.

نصائح أخرى

لإضافة إلى ما قاله جون السكيت، إذا تم استخدام القيم Cache'd التي ترجع داخليا لثم كنت لا تريد للمستخدم أن يستخدم القيم التي يمكن أن تتغير دون أن يكونوا على علم بها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top