2013-03-20 8 views
11

नोट का उपयोग करना, मैं इस विषय पर निम्न प्रश्नों के बारे में पता कर रहा हूँ:प्रदर्शन ओवरहेड्स जब संसाधन फ़ाइलें (.resx)

  1. Are there any performance issues or caveats with resource (.resx) files?

  2. Are string resources (.resx) properties kept in memory?

एट अल। हालांकि, मुझे इन सवालों में से कोई भी जवाब संतोषजनक नहीं लगता है (वे पर्याप्त ठोस नहीं हैं)।

मुझे इस विषय पर MSDN पृष्ठों के बारे में भी पता है, लेकिन यह संसाधन फ़ाइलों का उपयोग करने के ऊपरी हिस्से के बारे में तकनीकी जानकारी पर भी लग रहा है।


मेरी दुर्दशा यह है कि हम एक बड़े आकार के WinForms एप्लिकेशन के स्थानीयकरण पर उतरने वाले हैं। इस चरण में मेरी चिंता उदाहरण के लिए एक नेस्टेड लूप के भीतर से .resx फ़ाइल से संसाधनों तक पहुंचने के प्रदर्शन के बारे में है। वर्तमान में कोड के छोटे हिस्से के लिए हमने DataGridView इत्यादि के लिए स्थानीयकरण (स्तंभ नाम, पंक्ति शीर्षलेख इत्यादि) को स्थान दिया है। हम प्रासंगिक वर्ग के वैश्विक चर और संसाधनों का उपयोग कर संसाधनों को नकद कर रहे हैं।

.resx से संसाधनों को कैसे एक्सेस किया जाता है (क्या वे संकलन समय पर असेंबली में शामिल हैं?) और क्या उन संसाधनों को नकद करने और पहुंच के लिए वैश्विक चर का उपयोग करने का प्रदर्शन लाभ है?

उत्तर

14

स्ट्रिंग संसाधन स्मृति में कैश किए जाते हैं। "Resources.Designer.cs" में जेनरेट किया गया कोड देखें।

यह System.Resources.ResourceManager का उपयोग करता है, और यह तारों की कैशिंग करता है।

भी this ResourceManager constructor नोट करें। यह उल्लेख करता है कि आप कैशिंग रणनीति बदल सकते हैं:

यह कन्स्ट्रक्टर सिस्टम-प्रदत्त संसाधन संसाधन कार्यान्वयन का उपयोग करता है। कस्टम संसाधन फ़ाइल प्रारूप का उपयोग करने के लिए, आपको संसाधनसेट क्लास से प्राप्त करना चाहिए, GetDefaultReader और GetDefaultWriter विधियों को ओवरराइड करें, और उस प्रकार को संसाधन प्रबंधक (स्ट्रिंग, असेंबली, टाइप) कन्स्ट्रक्टर को पास करें। कस्टम रिसोर्ससेट का उपयोग संसाधन संसाधन कैशिंग नीति को नियंत्रित करने या अपने संसाधन फ़ाइल प्रारूप का समर्थन करने के लिए उपयोगी हो सकता है, लेकिन आम तौर पर आवश्यक नहीं है।

(मेरा जोर)

documentation for ResourceSet स्पष्ट रूप से कहते हैं:

ResourceSet वर्ग एक IResourceReader से अधिक विश्लेषण करता है, हर नाम और मान लोड हो रहा है, और उन्हें एक Hashtable

में भंडारण

तो हम सटीक कैशिंग स्ट्रै को जानते हैं tegy कि आप डिफ़ॉल्ट रूप से मिल जाएगा।

[संपादित करें] चूंकि आप मुझ पर विश्वास नहीं करते हैं!:)

(1) निर्माता ResourceManager(string baseName,Assembly assembly) के लिए प्रलेखन को देखें। इसमें कहा गया है:

यह निर्माता प्रणाली के द्वारा उपलब्ध कराया ResourceSet कार्यान्वयन उपयोग करता है।

(2) अब documentation for ResourceSet को देखो। इसमें कहा गया है:

ResourceSet वर्ग एक IResourceReader से अधिक विश्लेषण करता है, हर नाम और मान लोड हो रहा है, और उन्हें एक Hashtable में संग्रहीत।

इसलिए इस कैशिंग व्यवहार वास्तव में MSDN में दर्ज है, और इसके अलावा आप सत्यापित कर सकते यह है कि क्या कार्यान्वयन का निरीक्षण करने के Resharper का उपयोग करके हो रहा है कि।

+0

+1 आपके उत्तर के लिए बहुत बहुत धन्यवाद। सबसे की सराहना की। क्या आप मेरे लिए एक और चीज समझा सकते हैं। [एमएसडीएन डॉक्स] से संसाधन को कॉल करने के लिए (http://msdn.microsoft.com/en-us/library/yfsz7ac5.aspx) हम 'संसाधन प्रबंधक आरएम = नया संसाधन प्रबंधक ("उदाहरण स्रोत", टाइपऑफ (उदाहरण) .ssembly); स्ट्रिंग ग्रीटिंग = आरएम.गेटस्ट्रिंग ("ग्रीटिंग"); लेकिन मैं http://stackoverflow.com/a/1142840/626442 से समझता हूं कि यह 'कंसोल। राइटलाइन (स्ट्रिंग्स.हेल्लो) के माध्यम से भी किया जा सकता है;' जहां संसाधन फ़ाइल 'strings.resx' है। क्या अंतर है? – MoonKnight

+0

क्या आप इस प्रश्न के साथ मदद कर सकते हैं: http://stackoverflow.com/questions/15523604/error-in- जनरेशन-of-resource-resource-design-cs-file – MoonKnight

+1

'तारों का उपयोग करना। हेल्लो' स्वचालित रूप से स्वचालित रूप से उपयोग कर रहा है- 'Resources.Designer.cs' में उत्पन्न कक्षा –

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