2010-06-23 14 views
6
int expenseCode; 
if (int.TryParse(sourceRecord.ExpenseCode, out expenseCode) && _ExpenseCodeLookup.ContainsKey(expenseCode)) 
{ 
    destRow.PROFIT_CENTER_NAME = _ExpenseCodeLookup[expenseCode]; 
} 
else 
    destRow.PROFIT_CENTER_NAME = "Unknown"; 

जिस चीज के बारे में मुझे पता है वह पहली अभिव्यक्ति हमेशा चलती है (प्रक्रिया में expenseCode सेटिंग) दूसरे ऑपरेशन से पहले?क्या यह स्थिति खराब चीजों का कारण बनती है?

उत्तर

15

यह ठीक है। && सी # में शॉर्ट सर्किटिंग है, और out पैरामीटर निश्चित रूप से ContainsKey से पहले उपयुक्त मान असाइन किया जाएगा।

दूसरी ओर, आप मूल्य लाने के लिए फिर से एक ही चाल इस्तेमाल कर सकते हैं:

string profitCenter; 
int expenseCode; 
if (int.TryParse(sourceRecord.ExpenseCode, out expenseCode) && 
    _ExpenseCodeLookup.TryGetValue(expenseCode, out profitCenter)) 
{ 
    destRow.PROFIT_CENTER_NAME = profitCenter; 
} 
else 
{ 
    destRow.PROFIT_CENTER_NAME = "Unknown"; 
} 

इस तरह आप केवल एक बार खर्च कोड के देखने कर रहे हैं।

+0

TryGetValue पर टिप के लिए धन्यवाद! –

6

नहीं, इससे बुरी चीजें नहीं होतीं!

&& ऑपरेटर सही ऑपरेशन का मूल्यांकन न करने की गारंटी देता है यदि बाएं ऑपरेंड झूठी मूल्यांकन करता है। इसे शॉर्ट-सर्किटिंग कहा जाता है।

इसी तरह, || ऑपरेटर सही ऑपरेशन का मूल्यांकन नहीं करेगा यदि बाएं ऑपरेंड सत्य का मूल्यांकन करता है।

बूलियन मानों के लिए इन ऑपरेटरों के गैर-शॉर्ट-सर्किटिंग संस्करण & और | हैं। वे बाईं ओर के मूल्य के बावजूद दोनों ऑपरेटरों का मूल्यांकन करेंगे।

3

कथन ठीक है, && शॉर्ट सर्किट होगा, जिसका मतलब है कि दाईं ओर दाएं हाथ की तरफ आकस्मिक है। तो यदि TryParse सत्य लौटाता है, तो expenseCode मान्य पूर्णांक के साथ पॉप्युलेट किया जाएगा, और फिर सही फ़ंक्शन निष्पादित होगा।

संबंधित मुद्दे

 संबंधित मुद्दे