क्यों यह एक बुरा व्यवहार निम्न कोड में के रूप में लॉक का उपयोग करने के लिए है, मैं इस में this SO question hereउस ऑब्जेक्ट को लॉक करने का एक बुरा अभ्यास क्यों है जिसे हम बदलने जा रहे हैं?
private void DoSomethingUseLess()
{
List<IProduct> otherProductList = new List<IProduct>();
Parallel.ForEach(myOriginalProductList, product =>
{
//Some code here removed for brevity
//Some more code here :)
lock (otherProductList)
{
otherProductList.Add((IProduct)product.Clone());
}
});
}
there से अधिक जवाब उत्तरों के आधार पर एक बुरी बात है यह सोचते कर रहा हूँ का उल्लेख है, यह बुरा व्यवहार है कि लेकिन वे कहते हैं कि क्यों नहीं
नोट: कृपया कोड की उपयोगिता पर ध्यान न दें, यह सिर्फ उदाहरण प्रयोजन के लिए है और मैं इसे बिल्कुल उपयोगी
आपके पास कोड के साथ, 'अन्य उत्पाद सूची' इस कोड के लिए स्थानीय है, इसलिए इसे लॉक करने में कोई समस्या नहीं होगी (क्योंकि कोई भी इसे देख सकता है)। समस्याएं केवल (संभावित रूप से) आती हैं जब आप किसी अन्य चीज़ को लॉक करते हैं जो 'अन्य कोड' भी देख सकता है। – AakashM
@AakashM: सच नहीं है। यह कोड जितना अधिक नाजुक होना चाहिए, और आप यह गारंटी नहीं दे सकते कि 'अन्य उत्पाद सूची' फ़ंक्शन के बाहर या कक्षा के बाहर भी नहीं पारित की गई है। यदि "ब्रेवटी के लिए कोड हटा दिया गया है" में 'SomeRandomClass.SomeMethod (अन्य उत्पाद सूची)' पर कॉल शामिल है, तो आपने ऑब्जेक्ट को किसी और को दिया है। –
@DanPuzey इसलिए मेरी चेतावनी 'कोड के साथ आपके पास है'। मैं * गारंटी दे सकता हूं, क्योंकि मैं पूरे दायरे और चर के चर के उपयोग को देख सकता हूं। अगर टिप्पणियों को कोड द्वारा प्रतिस्थापित किया गया था, तो वास्तव में चीजें अलग हो सकती हैं; लेकिन यह हमेशा सच है कि अलग-अलग प्रश्नों के अलग-अलग उत्तर हो सकते हैं ... – AakashM