2011-04-06 23 views
5

क्या यह निम्नलिखित कथन बनाने के लिए कानूनी है:कैश == शून्य? क्या यह संभव है?

if(Cache[CACHE_KEY] == null) 
{ 
    //do something to form cache 
} 
else 
{ 
    //do something else that uses cache 
} 

मुझे यकीन नहीं है कि मेरा प्रोग्राम वास्तव में ठीक से काम कर रहा है (भले ही यह संकलित हो) और मुझे आश्चर्य हो रहा है कि कैश मौजूद नहीं है, तो यह शून्य हो गया है?

उत्तर

6

हां, यह कानूनी है (लेकिन शीर्षक में सवाल नहीं है, विवरण के लिए नीचे देखें)।

हालांकि, यह जाँच करने के लिए कैश में प्रकार क्या आप इस तरह के रूप के बजाय उम्मीद कर रहे हैं इस चेक दो बार क्या करने वाले, है कि बुद्धिमान हो सकता है:

//in English, the following line of code might read: 
// if the item known in the cache by the specified key is in 
// in fact of type MyExpectedReferenceType, then give me it 
// as such otherwise, give me a null reference instead... 
var myCachedInstance = Cache[key] as MyExpectedReferenceType; 
if (myCachedInstance == null) 
{ 
    //we retrieved a reference to an instance of an MyExpectedReferenceType 
} 
else 
{ 
    //oh, no - we didn't! 
} 

पर फिर से पढ़ने हालांकि अपने प्रश्न , और आपके प्रोग्राम के बारे में सोचने से ठीक से काम नहीं कर रहा है, मुझे यह कहने का लुत्फ है कि आपके पास इससे अधिक समस्याएं हैं; कैसे आपका प्रोग्राम सही ढंग से काम नहीं कर रहा है? Cache उदाहरण स्वयं ही null तक पहुंच योग्य नहीं होगा - यह Page का केवल-पढ़ने वाला फ़ील्ड है। हालांकि, आपके अपेक्षित कैश किए गए मान null हो सकते हैं और यदि यह समस्या है, तो आपको NullReferenceException प्राप्त करना चाहिए - क्या यह मामला है?

अद्यतन:

अपनी टिप्पणी से निपटने के लिए टिप्पणियाँ मैं कोड को जोड़ा की जाँच करें।

+0

क्षमा करें, "कैश [कुंजी] MyExpectedReferenceType के रूप में" क्या करता है? – locoboy

+0

@ cfarm54: मेरा अपडेट देखें। –

+0

हाहा, यह वास्तव में बहुत आसान है कि मुझे लगता है कि आप सोच रहे हैं। मैं बस इतना करने की कोशिश कर रहा हूं कि कैश मौजूद है या नहीं और यदि यह अस्तित्व में है तो इसका उपयोग करें ... – locoboy

2

बहुत अधिक कानूनी; इसके बजाय कार्रवाई करने से पहले मूल्य के लिए जांचने के लिए बेहतर है, विशेष रूप से यह सुनिश्चित करने के लिए कि कुंजी स्लाइड नहीं हुई है, या समाप्त हो चुकी है, आदि

+0

बेहतर की तुलना में क्या? ;) –

+0

** से बेहतर ** सभी की जांच नहीं **; या यह स्वीकार करने से बेहतर है कि इसमें वैध मान है। –

0

हां यह संभव है, कैश हमेशा प्रारंभ होगा (जैसे सत्र और आवेदन obj) लेकिन आप जांच सकते हैं कि कैश में कोई कुंजी शून्य है

2

कोड आप पोस्ट में एक संभावित रेस स्थिति नहीं है:

if(Cache[CACHE_KEY] == null) 
{  
    //do something to form cache 
} 
else 
{  
    // Another thread could have removed CACHE_KEY from the Cache before you get here 

} 

यह पहली बार कैश से वस्तु को निकालने के लिए तो अशक्त के लिए परीक्षण करते हैं, उदाहरण के लिए बेहतर है:

MyObject cachedObject = Cache[CACHE_KEY] as MyObject; 
// or MyObject cachedObject = (MyObject) Cache[CACHE_KEY]; if you know it is of type MyObject 
if(cachedObject == null) 
{  
    cachedObject = ... // generate the cached object 
    Cache.Insert(CACHE_KEY, cachedObject, ...); 
} 

// use cachedObject 
संबंधित मुद्दे