2010-09-08 9 views
21

मेरे पास एक ऐसी संपत्ति है जिसे मैं अपनी सेटिंग्स.सेटिंग फ़ाइल में int? के रूप में टाइप करना चाहता हूं।सेटिंग्स.सेटिंग में अनुमत int प्रकार की अनुमति है?

System.NullReferenceException:: जब मैं int? का उपयोग मैं एक क्रम की विफलता मिल एक वस्तु का एक उदाहरण के लिए सेट नहीं ऑब्जेक्ट संदर्भ ..

मैं एक समाधान के रूप में एक स्ट्रिंग प्रकार का उपयोग कर सकते हैं जहां अशक्त कार्यों के लिए एक चेक, लेकिन जब स्ट्रसे काम नहीं करता है तो मुझे स्ट्रिंग को पार्स करना होगा और त्रुटियों को संभालना होगा।

मूल्य को शून्य पर सेट करने में सक्षम होने से मुझे यह सुनिश्चित करने के दौरान सेटिंग फ़ाइल में प्रलेखित संपत्ति को रखने की अनुमति मिलती है कि कोई मान निर्धारित नहीं किया गया है।

int? configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; 
if (configuredNumberOfLimits == null ) 
{ 
    requiredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 
+0

उपयोग वर के बजाय? – Gage

+1

@Gage: मुझे लगता है कि यह बिंदु गुम है। वह सेटिंग * परिभाषित * को 'int' के रूप में चाहता है। –

उत्तर

2

मुझे लगता है कि आपका सर्वश्रेष्ठ दांव एक पुराने ढंग bool/int कॉम्बो होने जा रहा है: जब सेट नहीं मैं एक प्रोग्राम किया डिफ़ॉल्ट मान का उपयोग। यह सबसे सुंदर समाधान नहीं है, लेकिन यह वास्तव में नहीं है जोint? से अलग है।

int configuredNumberOfLimits; 
if (Settings.Default.HasRequiredNumberOfLimits) 
{ 
    configuredNumberOfLimits = Settings.Default.RequiredNumberOfLimits; 
} 
else 
{ 
    configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 
+0

धन्यवाद। Int के बाद से? सेटिंग्स.सेटिंग में समर्थित प्रकार नहीं है मेरी पसंद आपने जो सुझाव दिया है और क्या @ केविन सुझाव देता है। – Don

+0

@ मार्टिन: हाँ, बहुत अधिक;) –

3

के बारे में क्या:

int configuredNumberOfLimits 

if(!int.TryParse(Settings.Default.RequiredNumberOfLimits, 
    out configuredNumberOfLimits)) 
{ 
    configuredNumberOfLimits = DEFAULT_REQUIRED_NUMBER_LIMITS; 
} 

इस तरह आप मूल्य की जांच कर सकते हैं, और अगर यह विफल आप डिफ़ॉल्ट मान सेट करें। तार या पार्सिंग, या अन-हैंडल अपवादों के बारे में कोई चिंता नहीं।

+0

यह मैंने बताया है कि कामकाज है। यदि संभव हो तो मैं पार्स से बचना चाहता हूं। – Don

+0

मैंने यह कोशिश नहीं की है, लेकिन क्या आपने int कोशिश की? मूल्य = सेटिंग्स ... के रूप में (int) – kemiller2002

52

सेटिंग के लिए शून्य प्रकार (यानी int?) का उपयोग करने का एक तरीका है - इसे सेटिंग्स फ़ाइल का मैन्युअल संपादन करने की आवश्यकता है, लेकिन बाद में वीएस पर्यावरण और कोड में ठीक काम करता है। और कोई अतिरिक्त फ़ंक्शन या रैपर की आवश्यकता नहीं है।

ऐसा करते हैं, वांछित नाम (जैसे RequiredNumberOfLimit) के साथ एक सेटिंग बना सकते हैं और किसी भी प्रकार (उदाहरण के लिए मानक int सुविधा के लिए) का यह बनाने के लिए। परिवर्तनों को सहेजें।

अब अपनी परियोजना फ़ोल्डर में जाने के लिए और पाठ संपादक (नोटपैड, उदाहरण के लिए) के साथ "गुण \ Settings.settings" फ़ाइल को खोलने या आप "पर < आपका परियोजना > वी.एस. में खोल सकते हैं समाधान Explorer में राइट-क्लिक करके -> गुण -> सेटिंग्स.सेटिंग "," इसके साथ खोलें ... "चुनें और फिर" एक्सएमएल संपादक "या" स्रोत कोड (टेक्स्ट) संपादक "चुनें। खोला एक्सएमएल सेटिंग्स में अपनी सेटिंग को खोजने (यह इस तरह दिखेगा):

<Setting Name="RequiredNumberOfLimit" Type="System.Int32" Scope="User"> 
    <Value Profile="(Default)">0</Value> 
</Setting> 

बदलें System.Int32 से System.Nullable<System.Int32> "प्रकार" परम। और डिफ़ॉल्ट मान भी साफ़ करें (इसलिए डिफ़ॉल्ट रूप से शून्य का उपयोग किया जा सकता है)। अब इस खंड इस तरह दिखना चाहिए (ध्यान दें कि &lt; और &gt; प्रकार स्ट्रिंग के अंदर < और > प्रतीकों का प्रतिनिधित्व करने के लिए उपयोग किया जाता है - इस वी.एस. द्वारा एक्सएमएल का सही पार्सिंग के लिए किया जाता है):

<Setting Name="RequiredNumberOfLimit" Type="System.Nullable&lt;System.Int32&gt;" Scope="User"> 
    <Value Profile="(Default)" /> 
</Setting> 

अब परिवर्तनों को सहेजने और परियोजना सेटिंग्स फिर से खोलें - voilà! - हमारे पास आवश्यक हैम्बरऑफलिमिट टाइप System.Nullable<System.Int32> के साथ जो VS सेटिंग्स डिज़ाइनर द्वारा सही ढंग से पार्स किया गया है, साथ ही इसे कोड में सामान्य int? चर के रूप में उपयोग किया जा सकता है।

यदि आप यह सेटिंग null वापस करने में सक्षम होना चाहते हैं तो आपको डिफ़ॉल्ट मान फ़ील्ड को स्पष्ट रखना चाहिए। अन्यथा, डिफ़ॉल्ट मान को इस सेटिंग द्वारा वापस कर दिया जाएगा यदि इसे पहले शून्य करने के लिए असाइन किया गया था (लेकिन यह है कि डिफ़ॉल्ट मान कैसे काम करते हैं, है ना?: पी)।

+0

कूल !! एक जादू की तरह काम करता है! –

+4

दृष्टिकोण सेटिंग डिजाइनर में सेटिंग देखने और कोड में डिफ़ॉल्ट मान सेट करने के लिए किया गया था। हालांकि, जब मैंने यह परिवर्तन किया, तो मेरी सेटिंग App.config फ़ाइल से गायब हो गई। किसी दिए गए संदर्भ में यह महत्वपूर्ण हो सकता है या नहीं भी, लेकिन मैंने सोचा कि यह ध्यान देने योग्य था। – Brian

+1

@Brian ने जो कहा, उसे जोड़ने के लिए: हाँ, सेटिंग डिज़ाइनर के साथ संपादन app.config से सेटिंग्स को मिटा देगा, लेकिन यदि आप उन्हें वापस रख देते हैं, तो वे वहां से फिर से पढ़े जाते हैं। तो, या तो डिजाइनर का उपयोग न करें, या इसे इस्तेमाल करने के बाद सेटिंग्स को वापस रखना याद रखें ... दर्द का प्रकार, लेकिन मेरे मामले में मुझे लगता है कि यह इसके लायक है। – Paul

1

आप कर सकते हैं Settings.Designer.cs

उदाहरण के लिए में मैन्युअल सेट के प्रकार:

public decimal? Test{ 
     get { 
      return ((decimal?)(this["Test"])); 
     } 
     set { 
      this["Test"] = value; 
     } 
    } 
+0

इसके साथ समस्या यह है कि जब भी आप सेटिंग टैब में कोई परिवर्तन करते हैं, तो आपको Design.cs में वापस जाना होगा और फिर से प्रकार बदलना होगा। निश्चित रूप से –

+0

हां। मेरे मामले में मैं इसे बहुत ही कम बदलता हूं, और यह मेरे लिए कोई समस्या नहीं है –

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

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