2016-04-21 8 views
6

मुझे एक साफ/कॉम्पैक्ट पैटर्न चाहिए जो अपवाद सुरक्षित है और rulesKey का ठीक से निपटान करेगा, भले ही कुछ फेंक दिया गया हो। यह using के साथ संभव नहीं प्रतीत होता है (जब तक कि शायद 4 using एस नहीं हो सकता है, लेकिन ऐसा लगता है कि ऐसा वर्बोज़ और अतिरिक्त संसाधन खोलना है जिसे मुझे खोले जाने की भी आवश्यकता नहीं है)। मुझे क्या लगता है कि यह सी ++ में इतना प्रत्यक्ष/आसान होगा। क्या कोई अच्छा समाधान है?सी #: क्या उपयोग करने के साथ संयुक्त वस्तु को खोजने के लिए एक साफ पैटर्न है?

{ 
    RegistryKey rulesKey = null; 
    rulesKey = rulesKey ?? Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Company\\Internal\\Product"); 
    rulesKey = rulesKey ?? Registry.LocalMachine.OpenSubKey("Software\\Company\\Company\\Internal\\Product"); 
    rulesKey = rulesKey ?? Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Company\\Product"); 
    rulesKey = rulesKey ?? Registry.LocalMachine.OpenSubKey("Software\\Company\\Product"); 

    // Code using rulesKey, might throw 

    rulesKey.Close(); 
} 

उत्तर

8

आप इस्तेमाल कर सकते हैं

using (RegistryKey rulesKey = Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Company\\Internal\\Product") 
           ?? Registry.LocalMachine.OpenSubKey("Software\\Company\\Company\\Internal\\Product") 
           ?? Registry.LocalMachine.OpenSubKey("Software\\Wow6432Node\\Company\\Product") 
           ?? Registry.LocalMachine.OpenSubKey("Software\\Company\\Product")) 
{ 
    //use rulesKey here 
} 

के बाद से

कथन का उपयोग सुनिश्चित करता है निपटान में कहा जाता है कि एक अपवाद तब होता है, भले ही जब तुम वस्तु पर तरीकों बुला रहे हैं। आप ऑब्जेक्ट को एक कोशिश ब्लॉक के अंदर डालकर और अंततः ब्लॉक में निपटान करके उसी परिणाम को प्राप्त कर सकते हैं; वास्तव में, इस प्रकार कथन का अनुवाद कंपाइलर द्वारा किया जाता है। MSDN

+0

के खिलाफ भी कठोर है यदि कुंजियों में से कोई भी खोला नहीं जा सकता है? –

+1

चूंकि ['OpenSubKey'] (https://msdn.microsoft.com/en-us/library/z9f66s0a (v = vs.110) .aspx) विफल होने पर शून्य लौटाता है, तो 'नियम कुंजी' शून्य हो जाएगी सब असफल – AGB

+1

यदि कोई भी कुंजी खुलती नहीं है, तो यह शून्य होगी, जो 'उपयोग' कथन के लिए सुरक्षित है, कम से कम – VoidStar

0

आप निम्न की तरह कुछ भी कर सकते हैं। उदाहरण हार्ड-कोड किया गया है लेकिन आप आसानी से किसी फ़ाइल या डेटाबेस या पथ से पथ लोड कर सकते हैं। यह आपको उपयोग कथन को फूलाए बिना अतिरिक्त कुंजी जोड़ने की अनुमति देगा। यह प्रतिबंधित पहुंच

List<string> keyPaths = GetKeyPaths(); 
private void DoStuff() 
{   
    // key is disposed when leaving using block 
    using(var key = OpenFirstAvailableKey()) 
    { 
     if(key == null) 
     { 
      // handle error 
     } 

     // do stuff 
    } 
} 

private RegistryKey OpenFirstAvailableKey() 
{ 
    RegistryKey result = null; 
    try 
    { 
     foreach(var key in keyPaths) 
     { 
      result = Registry.LocalMachine.OpenSubKey(key); 
      if(result != null) 
      { 
       break; 
      } 
     }  
    } 
    catch (System.Exception) 
    { 
     // handle or throw   
     throw; 
    } 

    return result; 
} 

private List<string> GetKeyPaths() 
{ 
    List<string> paths = new List<string>(); 
    // Load from db or file or whatever...or just hardcode 
    paths.Add("Software\\Wow6432Node\\Company\\Internal\\Product"); 
    paths.Add("Software\\Company\\Company\\Internal\\Product"); 
    paths.Add("Software\\Wow6432Node\\Company\\Product"); 
    paths.Add("Software\\Company\\Product"); 

    return paths; 
} 
संबंधित मुद्दे