2011-08-25 20 views
5

मैं स्थिर कक्षा से कुछ स्ट्रिंग मानों तक पहुंचने के लिए ConfigurationManager का उपयोग करना चाहता हूं। हालांकि, मुझे विशेष रूप से मूल्य की अनुपस्थिति या खाली मूल्यों की उपस्थिति को संभालने की आवश्यकता है। अभी मैंकॉन्फ़िगरेशन मैनेजर और स्टेटिक क्लास

private static readonly string someStr = ConfigurationManager.AppSettings["abc"]; 

नौकरी करने के लिए प्रकार प्रारंभकर्ताओं का उपयोग कर रहा था। हालांकि, यदि App.config में कुंजी "एबीसी" वाला कोई स्ट्रिंग मौजूद नहीं है, तो someStr के स्थान पर निष्पादन null संदर्भ के साथ जारी रहेगा। प्रारंभिकरण पर इस मान को मान्य करने का सबसे अच्छा तरीका क्या है? एक स्थिर रचनाकार जिसमें मैं मूल्य आरंभ करता हूं और फिर वैधता की जांच करता हूं? मैंने सुना है कि स्थैतिक रचनाकारों से बचा जाना चाहिए और जब संभव हो तो टाइप प्रारंभकर्ताओं द्वारा प्रतिस्थापित किया जाना चाहिए।

उत्तर

6

मैं कुछ इस तरह उपयोग कर रहा हूँ:

public static readonly string someStr = 
     ConfigurationManager.AppSettings["abc"] ?? "default value"; 

या खाली स्ट्रिंग को संभालने के लिए:

public static readonly string someStr = 
      !String.IsNullOrEmpty(ConfigurationManager.AppSettings["abc"]) ? 
          ConfigurationManager.AppSettings["abc"] : "default value"; 
2

स्थिर कंस्ट्रक्टर्स ठीक हैं, उनके बारे में महान बात यह है कि वे गारंटी द्वारा हैं रनटाइम केवल एक बार और एक बार निष्पादित किया जाना चाहिए - किसी भी परिस्थिति में कक्षा का पहली बार उपयोग किया जाता है।

आप वैकल्पिक रूप से एक डिफ़ॉल्ट मान सेट करने के लिए सम्मिलित ऑपरेटर (??) इस्तेमाल कर सकते हैं:

private static readonly string someStr = ConfigurationManager.AppSettings["abc"] ?? "some default value"; 
4

यह सिर्फ एक कोड की समीक्षा में आया। प्रदान किए गए उत्तर तारों के लिए बहुत अच्छे हैं। लेकिन वे एक int या डबल, आदि के लिए काम नहीं करते हैं ... आज, मुझे इसे पुनः प्रयास करने के लिए ऐसा करने की ज़रूरत है और इसे एक int होना चाहिए।

तो यहां उन लोगों के लिए एक उत्तर है जो टाइप रूपांतरण शामिल करना चाहते हैं।

इस विस्तार विधि का उपयोग करें: http://www.rhyous.com/2015/12/02/how-to-easily-access-a-web-config-appsettings-value-with-a-type-and-a-default-value

आशा है कि अगले आदमी में मदद करता है:

using System.Collections.Specialized; 
using System.ComponentModel; 

namespace Rhyous.Config.Extensions 
{ 
    public static class NameValueCollectionExtensions 
    { 
     public static T Get<T>(this NameValueCollection collection, string key, T defaultValue) 
     { 
      var value = collection[key]; 
      var converter = TypeDescriptor.GetConverter(typeof(T)); 
      if (string.IsNullOrWhiteSpace(value) || !converter.IsValid(value)) 
      { 
       return defaultValue; 
      } 

      return (T)(converter.ConvertFromInvariantString(value)); 
     } 
    } 
} 

मैं भी इसके लिए इकाई परीक्षण, जिसे आप यहां प्राप्त कर सकते हैं की है।

+0

यह अब मेरे Rhyous.Collections NuGet पैकेज में है और आप गिटहब पर स्रोत देख सकते हैं: https://github.com/rhyous/Collections/blob/master/src/Rhyous.Collections/Extensions/NameValueCollectionExtensions.cs – Rhyous

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